В настоящее время я использую 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 минуту, что все еще слишком медленно. Есть ли дополнительные директивы для улучшения использования индекса?