Я использую 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 , тоже быстрее, но не вариант для приложения, поскольку поиск должен извлекать «части», а не «точно» текстовое содержание.
Любое предложение / идея / помощь приветствуется!