1

我正在对存储在 eXist-db 中的集合运行 ft:query,但它返回零结果。如果我使用 fn:contains 函数,它可以完美运行,但 ft:query 返回零结果。下面是我的 XML 结构、索引配置文件和查询:

测试.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>

集合.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>

测试.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
4

2 回答 2

1

我不确定以您所做的方式配置没有停用词的标准分析器是否正确。您能否向 Monex 查询您的索引中是否包含您的术语?

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

于 2017-01-10T14:31:42.517 回答
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 应用程序的索引窗格,以确保数据库已按预期应用了您的索引配置。

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

于 2017-01-10T14:33:48.040 回答