eXist-db ft:query 返回零结果而 运行 eXide 或氧气

eXist-db ft:query returning zero result while running eXide or oxygen

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

我不确定按照您的方式配置没有停用词的标准分析器是否正确。您可以向 Monex 确认您的索引中包含您的条款吗?

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

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

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

这对集合中 rsc:doctitle 个元素的字符串 studies 执行全文查询。要使 ft:query() 函数起作用,命名元素必须有一个索引配置。这将我们带入您的索引配置。

在你的索引配置中,你有一个全文(Lucene)索引:

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

几个问题:

  1. @qname 属性应该是一个 QName - 简单地说,一个元素或属性名称。您已将其表达为一条路径。删除路径 //,只留下 rsc:article.

  2. 您的代码在 rsc:doctitle 上执行全文查询,而不是在 rsc:article 上执行全文查询,因此我希望您的代码,如所写,得到 return 0 个结果.将现有索引更改为 rsc:doctitle,或在 rsc:doctitle 上添加新索引,以便您可以查询其中任何一个。之后重新索引集合,并按照 Adam 的建议,检查 Monex 应用程序的索引窗格以确保数据库已按预期应用您的索引配置。

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