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"/>
几个问题:
@qname
属性应该是一个 QName - 简单地说,一个元素或属性名称。您已将其表达为一条路径。删除路径 //
,只留下 rsc:article
.
您的代码在 rsc:doctitle
上执行全文查询,而不是在 rsc:article
上执行全文查询,因此我希望您的代码,如所写,得到 return 0 个结果.将现有索引更改为 rsc:doctitle
,或在 rsc:doctitle
上添加新索引,以便您可以查询其中任何一个。之后重新索引集合,并按照 Adam 的建议,检查 Monex 应用程序的索引窗格以确保数据库已按预期应用您的索引配置。
最后,contains()
不需要索引到位。它受益于范围索引(即您的 <create>
元素)的存在,但范围索引与全文索引有很大不同。要了解有关这些的更多信息,我建议阅读有关索引的 eXist 文档,http://exist-db.org/exist/apps/doc/indexing.xml。
我正在 运行 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"/>
几个问题:
@qname
属性应该是一个 QName - 简单地说,一个元素或属性名称。您已将其表达为一条路径。删除路径//
,只留下rsc:article
.您的代码在
rsc:doctitle
上执行全文查询,而不是在rsc:article
上执行全文查询,因此我希望您的代码,如所写,得到 return 0 个结果.将现有索引更改为rsc:doctitle
,或在rsc:doctitle
上添加新索引,以便您可以查询其中任何一个。之后重新索引集合,并按照 Adam 的建议,检查 Monex 应用程序的索引窗格以确保数据库已按预期应用您的索引配置。
最后,contains()
不需要索引到位。它受益于范围索引(即您的 <create>
元素)的存在,但范围索引与全文索引有很大不同。要了解有关这些的更多信息,我建议阅读有关索引的 eXist 文档,http://exist-db.org/exist/apps/doc/indexing.xml。