скорость разных способов полнотекстового поиска в XQuery (BaseX) - PullRequest
1 голос
/ 17 февраля 2020

Я использую BaseX 9.3.1 для доступа к около 45 000 записей словаря с около 1 миллиона примеров и т. Д. c. Имея полнотекстовый индекс, а также один для всех текстовых узлов и атрибутов. Пока все так плохо. Доступ к узлам для грамматики или значения довольно быстрый. Доступ к примерам, однако, очень медленный, но только в некоторых запросах - не во всех. Я пытался найти причину следующего, но просто не удалось с документацией BaseX или некоторые XQuery-страниц и т. Д. c. Может быть, я просто не вижу лес за деревьями. Вот проблема:

ft:search("myDatabase", "mySearchString")

очень быстрый и реагирует менее чем за секунду, тогда как

ft:contains(db:open("myDatabase")/path/to/target/node, "mySearchString")

, а также

db:open("myDatabase")/path/to/target/node contains text "mySearchString"

и

db:open("myDatabase")/path/to/target/node[contains(./text(), "mySearchString")]

настолько медленный (> 30 с) и тяжелый, что иногда даже ломает сервер.

Я пытался выяснить различия, изменяя параметры для определения параметров или сортировки, но это не помогло заметная разница в скорости. ft:contains() - это, согласно документации, расширенная версия contains text стандартного XQuery. ft:search представляется командой BaseX для полнотекстового поиска (см. Документы BaseX ).

ft:search() довольно хорошо работает с некоторым дополнительным кодом для получения желаемого контента. Но на самом деле это больше похоже на обходной путь. Мне нужно понять, почему прямой доступ к пути такой медленный, хотя для него также есть индекс. Использование text() вместо любой версии , содержащей или match , тоже быстрее, но не вариант для приложения, поскольку поиск должен извлекать «части», а не «точно» текстовое содержание.

Любое предложение / идея / помощь приветствуется!

...