Marklogic: получение количества слов из словаря слов элемента

У меня есть два образца XML-файла:

abc.xml

<data>
<text>i am a test user and doing testing here more and more. What are you doing?</text>
<data>

def.xml

<data>
<text>We are a doing nothing here you can say it time pass. what are you doing?</text>
<data>

Теперь я создал лексиконы слов элемента для элемента <text>. Меня интересует следующее:

  1. Получение всех уникальных слов и их количества во всей БД (имея только более двух файлов).
  2. Получение всех уникальных слов для заданных файлов

person user1660340    schedule 09.10.2012    source источник


Ответы (2)


См. http://docs.marklogic.com/guide/search-dev/lexicon#chapter

person mblakele    schedule 09.10.2012
comment
Вся эта ссылка говорит о получении значения элемента / атрибута элемента и их подсчета (с использованием cts: frequency) ИЛИ получения уникальных слов и т.д., но то, что я ищу, для получения уникальных слов, а также появления этого слова в данном uri или во всей БД . - person user1660340; 10.10.2012

1) Для всех уникальных слов и количества совпадающих фрагментов:

for $w in cts:element-words(xs:QName('text'))
return 
element word {
    attribute count { 
      xdmp:estimate(cts:search(doc(), cts:word-query($w))
    },
    $w }

Это должно быть довольно быстро, но чтобы получить фактическое количество слов, а не просто количество фрагментов, я думаю, вам, возможно, придется проверить каждый фрагмент, и это может стать очень медленным:

sum(
  cts:search(doc(), cts:word-query($w))/cts:highlight(.,
    cts:word-query($w),<match/>)/count(//match)
  )

2) Для всех уникальных слов в файле:

for $d in doc()
return element file {
    for $w in cts:element-words(xs:QName('text'), (), (),
        cts:document-query(xdmp:node-uri($d))
    return element word { $w }
}

Если у вас включен лексикон URI, вы можете дополнительно оптимизировать 2) путем повторения cts:uris() вместо doc() и передачи этого значения в качестве четвертого аргумента в cts:element-values() вместо вызова xdmp:node-uri в документе.

person wst    schedule 09.10.2012
comment
Я попытался выполнить вышеуказанный запрос (Решение для 1), но он дал мне неверный результат: ‹предупреждение результатов = более одного корневого элемента› ‹количество слов = 1› Я тестирую пользователя и все больше и больше тестирую здесь. Что ты делаешь? ‹/Word› ‹количество слов = 1› Мы здесь ничего не делаем, можете сказать, время идет. что ты делаешь? ‹/word› ‹/results› чего я здесь ожидаю индивидуальный подсчет слов, как в моем случае, когда 2 раза делаю 3 раза и т. д. - person user1660340; 10.10.2012
comment
Вы уверены, что у вас есть словарный запас слов, а не индекс диапазона элементов? Индексы диапазонов - это словари значений, а не словарные словари, поэтому они хранят полное значение каждого элемента, а не отдельные слова. Это то, что предлагает ваш вывод. - person wst; 10.10.2012
comment
я создал на нем и [словарный запас слов элемента, так и индекс диапазона элементов]. Я также попытался удалить на нем индекс диапазона элементов, но в этом случае ваш запрос выше дал мне ошибку. поскольку cts: element-values ​​обязательный индекс диапазона элементов. Кто-нибудь может мне в этом помочь? не нашел оптимизированного решения - person user1660340; 16.10.2012
comment
@ user1660340 Взгляните на обновленное решение. Использование cts:element-words вместо cts:element-values должно решить проблему. - person wst; 17.10.2012
comment
Я пробовал обновленное решение, но подсчитал все слова как 0. :( - person user1660340; 17.10.2012
comment
@ user1660340 Извините, cts:frequency работает только со словарями значений, но не со словарями. Вы можете быстро подсчитать количество фрагментов, содержащих слово, но я думаю, к сожалению, на самом деле подсчет вхождений будет медленным - вам придется фактически подсчитывать в каждом отдельном фрагменте. Взгляните на обновление для некоторых идей. - person wst; 17.10.2012