eXist-db ft:查询在运行eXide或氧气时返回零结果

时间:2017-01-10 10:19:29

标签: xquery exist-db oxygenxml exide

我正在运行ft:查询存储在eXist-db中的集合,但它返回零结果。如果我使用fn:contains函数它完美但ft:查询返回零结果。下面是我的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 个答案:

答案 0 :(得分:1)

我不确定是否以正确的方式配置没有停用词的标准分析器。您能否与Monex核实您的索引中是否包含您的条款?

另请注意,如果在加载索引后创建了索引配置,则需要重新索引集合。重新索引时,还值得监视$EXIST_HOME/webapp/WEB-INF/exist.log以确保索引按预期完成。

答案 1 :(得分:1)

让我们从您的查询开始。查询的关键部分是:

$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上添加新索引,以便查询其中任何一个。之后重新索引集合,并按照Adam的建议,检查Monex应用程序的索引窗格,以确保数据库已按预期应用了索引配置。

  3. 最后,contains()不需要索引。它受益于范围索引(即您的<create>元素)的存在,但范围索引与全文索引完全不同。要了解有关这些内容的更多信息,我建议您阅读有关索引的eXist文档http://exist-db.org/exist/apps/doc/indexing.xml