Как получить общее количество документов в базе данных Marklogic?

У меня в базе данных Marklogic около 20 lacs-документов. Я хочу, чтобы общее количество документов в моем поисковом приложении было разбито на страницы. Для получения итогов я использую

xdmp:estimate(cts:search(doc(), $query))

где $ query - это комбинация различных запросов, объединенных в cts:and-query. Но я не получаю правильную сумму. Если $ query пусто, он показывает гораздо большее количество документов, чем общее количество документов в базе данных. Когда я использую

xdmp:estimate(doc())

он показывает мне правильную сумму, но это будет статическая сумма, которая не изменится в соответствии с запросом. Мне нужна сумма в соответствии с результатами, возвращенными в ответ на конкретный запрос, поэтому я передал $ query в качестве аргумента, но он не показывает правильную сумму. fn:count() показывает правильное общее количество, но когда количество документов составляет около 20 лаковых пакетов, fn:count() не работает, потому что fn:count() медленнее, чем xdmp:estimate().

Пожалуйста, помогите мне получить правильное общее количество документов, возвращенных в ответ на поисковый запрос, введенный пользователем.


person Puneet Pant    schedule 18.05.2012    source источник


Ответы (2)


Чтобы понять, что здесь происходит, начните с прочтения технического документа по архитектуре на странице http://resources.marklogic.com/library/media/inside-marklogic

Теперь попробуйте этот тестовый пример:

xdmp:estimate(doc()),
xdmp:estimate(cts:search(doc(), ()))

Первое выражение подсчитает количество документов в базе данных. Второе выражение подсчитает количество фрагментов документа в базе данных. Поэтому, если результаты отличаются, вероятно, у вас настроены корни фрагментов или родительские фрагменты. Некоторые специальные документы также создают дополнительные фрагменты: я думаю, что это делают орфографические словари и тезаурусные документы.

Если вы хотите ограничить оценку корнями XML-документа, укажите корневое QName (s) документа в доступном для поиска выражении или используйте /*, если вам не важно имя корневого элемента.

xdmp:estimate(cts:search(/*, ()))

Вы также можете использовать аргумент cts: query, чтобы указать QName, которое появляется только в тех документах, которые вы хотите подсчитать.

person mblakele    schedule 18.05.2012

Я не понимаю твоего вопроса. Вы хотите получить общее количество документов в базе данных ИЛИ общее количество документов, соответствующих вашему запросу?

xdmp:estimate - правильный путь, но это всего лишь ОЦЕНКА. ЕСЛИ запрос, используемый в оценке, может быть полностью разрешен из индексов, тогда оценка будет на 100% правильной. Однако, если запрос не может быть полностью разрешен из индексов (требуется фильтрация), тогда оценка будет на некоторую величину. Это потому, что xdmp:estimate использует индексы только для подсчета. Сравните fn:count(cts:search(doc(), $query)) с xdmp:estimate(cts:search(doc(), $query)). Если результаты для данного запроса значительно отличаются, вам нужно либо включить дополнительное индексирование для поддержки этого запроса, либо жить с разницей.

person Clark Richey    schedule 18.05.2012