eXist-db查询不使用索引

时间:2015-04-26 02:00:48

标签: exist-db

我目前在Windows 7上使用eXist-db 2.2,为Java分配了1.3gb的RAM。

我一直在尝试优化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文件的大小范围从&lt; 10K到&gt; 2M。我已经加载了大约12,000个这些文件,基本查询目前需要5分钟。

更新 - &gt;我更新了 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>

现在似乎使用了索引,因为查询会更快地返回结果。但是&#34;更快&#34;这意味着大约1分钟后返回结果,这仍然太慢。是否有其他指令来提高索引利用率?

1 个答案:

答案 0 :(得分:0)

您的索引定义似乎与documentation不匹配。

我认为你应该使用

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

您当前的索引可能正在寻找值/值。