Проблема поиска по ключевым словам в XQuery - PullRequest
0 голосов
/ 11 апреля 2019

Я изучаю поиск по ключевым словам XQuery и отображаю результаты на веб-сайте. И я обнаружил, что есть полезный учебный сайт, шаг за шагом, чтобы разработать сайт.

Однако я получил ошибку (Неверный текст qname: счетчик совпадений) после выполнения кода. Отсутствует ли определение пространства имен?

Кто-нибудь может помочь мне решить проблему? Спасибо.

Обучающий веб-сайт: https://en.wikibooks.org/wiki/XQuery/Keyword_Search

Error Screen

Coding Part

1 Ответ

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

Функция, помеченная сообщением об ошибке text:match-count(), устарела и удалена из eXist, как и исходный специфический для eXist оператор полнотекстового поиска &=. В результате статья (которую мне напоминает страница истории, которую я написал 10 лет и 3 месяца назад!) Остро нуждается в обновлении. Эти «устаревшие» полнотекстовые функции были удалены из eXist, потому что было добавлено гораздо более совершенное решение, полнотекстовый индекс на основе Lucene, о котором вы можете прочитать в https://exist -db.org / exist / apps / doc / Lucene .

Обновленная статья будет посвящена новому полнотекстовому индексу на основе Lucene. Сначала создайте файл конфигурации коллекции с именем collection.xconf:

<collection xmlns="http://exist-db.org/collection-config/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <lucene>
            <text qname="body"/>
            <text qname="biography"/>
        </lucene>
    </index>
</collection>

Сохранить этот документ в коллекции /db/test. eXide сэкономит вам несколько шагов, предложив (1) сохранить копию документа там, где она действительно должна быть (в коллекции /db/system/config/db/test) и (2) переиндексировать коллекцию /db/test, чтобы применить новую конфигурацию коллекции ( что вы можете сделать вручную с помощью xmldb:reindex("/db/test")):

Если файл конфигурации коллекции сохранен как /db/system/config/db/test/collection.xconf, вы можете запросить коллекцию /db/test с помощью функции ft:query и отсортировать результаты с помощью функции ft:score:

let $hits := 
    ( 
        collection('/db/test/articles')/article/body,
        collection('/db/test/people')/people/person/biography
    )[ft:query(., $q)]
for $hit in $hits
let $score := ft:score($hit)
order by $score descending
return $hit

(Обратите внимание, что в отличие от статьи, мы можем обойтись без фильтрации предоставленной пользователем строки запроса, поскольку мы больше не используем util:eval. Во-первых, в этом не было необходимости.)

С этим изменением - переход на более новую систему полнотекстового поиска на основе Lucene в eXist - остальная часть статьи должна в основном применяться.

...