eXist-db ft: запрос, возвращающий нулевой результат при запуске eXide или кислорода

Я запускаю ft: query для коллекции, которая хранится в eXist-db, но возвращает ноль результатов. Если я использую функцию fn: contains, она отлично работает, но ft: query возвращает ноль результатов. Ниже моя структура XML, файл конфигурации индекса и запрос:

test.xml

<article xmlns="http://www.rsc.org/schema/rscart38"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    type="ART" 
    xsi:schemaLocation="http://www.rsc.org/schema/rscart38 http://www.rsc.org/schema/rscart38/rscart38.xsd" dtd="RSCART3.8">
    <metainfo last-modified="2012-11-23T19:16:50.023Z">
        <subsyear>1997</subsyear>
        <collectiontype>rscart</collectiontype>
        <collectionname>journals</collectionname>
        <docid>A605867A</docid>
        <doctitle>NMR studies on hydrophobic interactions in solution Part
            2.—Temperature and urea effect on
            the self-association of ethanol in water</doctitle>
        <summary/>
</article>

collection.xconf

<collection xmlns="http://exist-db.org/collection-config/1.0">
    <index rsc="http://www.rsc.org/schema/rscart38"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        type="ART"
        xsi:schemaLocation="http://www.rsc.org/schema/rscart38 http://www.rsc.org/schema/rscart38/rscart38.xsd" 
        dtd="RSCART3.8">
        <fulltext default="all" attributes="false"/>
        <lucene>
            <analyzer id="nosw" class="org.apache.lucene.analysis.standard.StandardAnalyzer">
                <param name="stopwords" type="org.apache.lucene.analysis.util.CharArraySet"/>
            </analyzer>
            <text qname="//rsc:article" analyzer="nosw"/>
        </lucene>
        <create path="//rsc:doctitle" type="xs:string"/>
        <create path="//rsc:journal-full-title" type="xs:string"/>
        <create path="//rsc:journal-full-title" type="xs:string"/>
    </index>
</collection>

test.xq

declare namespace rsc="http://www.rsc.org/schema/rscart38";
let $coll := collection('/db/apps/test/RSC')
let $hits := $coll//rsc:doctitle[ft:query(., 'studies')] 
return 
    $hits

2 ответа

Решение

Начнем с вашего запроса. Ключевая часть вашего запроса:

$coll//rsc:doctitle[ft:query(., 'studies')] 

Это выполняет полнотекстовый запрос для строки studies на rsc:doctitle элементы в коллекции. За это ft:query() Для работы функции должна существовать конфигурация индекса для именованных элементов. Это подводит нас к вашей конфигурации индекса.

В вашей конфигурации индекса у вас есть полнотекстовый (Lucene) индекс:

<text qname="//rsc:article" analyzer="nosw"/>

Пара вопросов:

  1. @qname Атрибут должен быть QName - просто именем элемента или атрибута. Вы выразили это как путь. Удалить путь //оставив всего rsc:article,

  2. Ваш код выполняет полнотекстовый запрос на rsc:doctitle, не на rsc:article, поэтому я ожидаю, что ваш код, как написано, вернет 0 результатов. Изменить существующий индекс на rsc:doctitleили добавить новый индекс на rsc:doctitle так что вы можете запросить любой из них. После этого переиндексируйте коллекцию, и, как предложил Адам, проверьте панель индексирования приложения Monex, чтобы убедиться, что база данных применила вашу конфигурацию индекса, как и ожидалось.

И, наконец, contains() не требует наличия индекса. Выгода от наличия индекса диапазона (т. Е. Вашего <create> элементы), но индексы диапазона весьма отличаются от полнотекстовых индексов. Чтобы узнать больше об этом, я бы предложил прочитать документацию eXist по индексированию, http://exist-db.org/exist/apps/doc/indexing.xml.

Я не уверен, правильно ли настроен стандартный анализатор без стоп-слов, как вы это сделали. Можете ли вы проверить с Monex, что в вашем индексе есть ваши условия?

Также обратите внимание, что если вы создали конфигурацию индекса после загрузки индекса, вам необходимо переиндексировать коллекцию. При переиндексации тоже стоит следить $EXIST_HOME/webapp/WEB-INF/exist.log чтобы убедиться, что индексация выполняется, как ожидалось.

Другие вопросы по тегам