Есть ли способ изменить количество фасетов API поиска, чтобы оно отображало общее количество слов вместо количества совпадающих фрагментов (документов)? - PullRequest
1 голос
/ 11 апреля 2019

Я создаю приложение, используя Marklogic 8 и API поиска. Мне нужно создать фасеты на основе определенных коллекций MarkLogic, но вместо того, чтобы подсчет фасетов подсчитывал количество фрагментов (документов), которые содержат Х количество вхождений выполненного поиска по ключевым словам, мне нужно, чтобы количество фасетов отражало общее число раз ключевое слово появляется во всех документах в коллекции.

Сейчас я использую search: search () для обработки запроса и возврата элемента с включенной опцией facet.

В документации MarkLogic я смотрел на cts :quency (), которая гласит: «Если вы хотите указывать общую частоту вместо частоты на основе фрагментов (т. Е. Общее количество вхождений значения в элементах, указанных в параметре cts: запроса API-интерфейса лексикона), необходимо указать параметр частоты элемента к вводу значения API лексикона в cts: частота. "

Но я не могу заставить это работать.

Я пытался выполнить такой запрос в консоли запросов, но время ожидания истекло.

cts:element-values(QName("http://www.tei-c.org/ns/1.0", "TEI"),
"", "item-frequency",   
 cts:and-query((
    fn:collection("KirchlicheDogmatik/volume4/part3"),
    cts:word-query("lehre"))))

1 Ответ

1 голос
/ 11 апреля 2019

Возможно, проблема в том, что у вас есть индекс диапазона на <TEI>, который содержит весь документ.Индексы диапазона отображаются в памяти, поэтому вы по существу принудительно поместили все текстовое содержимое вашей базы данных в память.Трудно точно сказать, что происходит, но, вероятно, трудно проверить значения (индексы диапазона рассчитаны на более мелкие атомарные значения) и, возможно, перейти на диск.

MarkLogic имеет отличную документацию по индексированию, поэтому я бы рекомендовал начать там, чтобы лучше понять, как их использовать: https://docs.marklogic.com/guide/concepts/indexing#id_51573

Обратите внимание, что даже при использовании опции item-frequency,результаты (или количество) не гарантируются как "один к одному" с "общим числом раз, когда ключевое слово появляется".Он сообщит количество совпадений «элементов» - в вашем примере он сообщит о количестве совпадений <TEI> элементов.

Проблема получения точного количества терминов, соответствующих запросу во всей базе данных, заключается в том, чтона самом деле довольно сложно.Чтобы получить точные совпадающие значения в документе, вам нужно будет использовать cts:highlight или cts:walk, что требует загрузки всего документа в память.Как правило, это хорошо работает для подмножества документов, но в конечном итоге, чтобы получить точное значение для всей базы данных, вам необходимо загрузить всю базу данных в память и обработать каждый документ.

Практически любой подход к получению терминаСчетчик совпадений требует некоторого приближения и сильно зависит от вашей разметки.Например, если вы индексируете элементы <p> (или даже лучше <s>), можно будет создать запрос, использующий индексы для подсчета количества совпадающих абзацев (или предложений), но при этом все равно будет загружен невероятно большойколичество данных в память и хранить его там.Это технически возможно, если вы хотите выделить достаточно памяти (и / или серверов), но вряд ли это того стоит.

...