Запрос eXist-db не использует индекс

В настоящее время я использую eXist-db 2.2 в Windows 7 с 1,3 ГБ оперативной памяти, выделенной для Java.

Я пытался оптимизировать XQuery:

xquery version "3.0";

let $phrase := "flight"
let $nbsp := " "
    let $containing := collection("/db/MyDb")//value[contains(.,$phrase)]
    return (count($containing))

но этот запрос всегда выполняет сканирование базы данных. Мой collection.xconf таков:

<collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <index>
        <fulltext default="none" attributes="false"/>
        <!-- create qname="value" content="mixed" /-->
        <lucene>
            <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
            <analyzer id="ws" class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
            <text qname="value" analyzer="ws"/>
        </lucene>
        <range>
            <create qname="value">
                <field name="value" match="value" type="xs:string" case="no"/>
            </create>
        </range>
    </index>
</collection>

Узел value существует на нескольких уровнях XML, поэтому я надеялся, что он проиндексирует этот конкретный узел независимо от того, где он находится в дереве.

Есть ли у вас какие-либо предложения по использованию индекса?

Обновлено, чтобы включить используемый мной фрагмент XML:

<v1 attribute1="b3492">
    <person>
        <sub id="b733" name="b733" />
        <section id="5897" label="a">
            <section id="e70e" label="a.a" >
                <field id="7e8a" label="a.a.f01">
                    <value type="String">test value</value>
                </field>
                <section id="78ea1" label="a.a.s01" >
                    <field id="7e8a" label="a.a.s01.f01">
                        <value type="String">test value 2</value>
                    </field>
                </section>
            </section>
        </section>
    </person>
</v1>

Размер используемых мной XML-файлов колеблется от ‹10K до> 2M. Я загрузил около 12 000 таких файлов, и на данный момент простой запрос занимает более 5 минут.

Обновление -> Я обновил collection.xconf следующим образом:

<collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <index>
        <fulltext default="none" attributes="false"/>
        <!-- create qname="value" content="mixed" /-->
        <lucene>
            <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
            <analyzer id="ws" class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
            <text qname="value" analyzer="ws"/>
        </lucene>
        <range>
            <create qname="value" type="xs:string"/>
        </range>
    </index>
</collection>

Индекс теперь используется, так как запросы возвращают результаты быстрее. Однако «быстрее» здесь означает, что результаты возвращаются примерно через 1 минуту, что все еще слишком медленно. Есть ли дополнительные директивы для улучшения использования индекса?


person soler    schedule 26.04.2015    source источник
comment
При запросе / индексировании всегда прилагайте запрашиваемый пример XML-фрагмента.   -  person DiZzZz    schedule 26.04.2015


Ответы (1)


Ваше определение индекса не соответствует документации.

Я думаю, тебе стоит использовать

<range>
  <create qname="value" type="xs:string" />
</range>

Ваш текущий индекс, вероятно, ищет соотношение цена / качество.

person GSpringTech    schedule 26.04.2015
comment
пример кода для combined indexes (его можно найти здесь: exist-db.org/ exist / apps / doc / newrangeindex.xml) выглядит так: <range> <create qname="mods:name"> <field name="name-type" match="@type" type="xs:string"/> <field name="name-part" match="mods:namePart" type="xs:string"/> </create> </range> - person soler; 26.04.2015
comment
Пример для комбинированных индексов, которые, вероятно, не применимы в вашем случае; Вы также должны были предоставить фрагмент XML, чтобы иметь возможность судить о запросе. user3787337 уже предоставил то же самое. - person DiZzZz; 26.04.2015
comment
спасибо @DiZzZz, исходный запрос не был написан в этом формате, но в Exist 2.2, хотя в документации упоминается возможность использования case="no", было невозможно внедрить его в узел создания. Я обновлю запрос до исходных настроек без учета проблемы и отвечу в этой ветке. - person soler; 26.04.2015
comment
Я изменил collection.conf, чтобы он соответствовал предложенному. Думаю, я был смущен его использованием, поскольку на странице профилирования не отображается, что он все еще используется. Кроме того, запрос возвращает результат не менее минуты. Есть ли варианты улучшить время отклика? - person soler; 27.04.2015
comment
Помог ли этот ответ? Если да, отметьте его как ответ, чтобы этот вопрос больше не оставался без ответа. - person Joe Wicentowski; 05.09.2018