【问题标题】:eXist-db ft:query returning zero result while running eXide or oxygeneXist-db ft:查询在运行 eXide 或氧气时返回零结果
【发布时间】:2017-05-24 19:14:27
【问题描述】:

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

【问题讨论】:

  • 您运行的是哪个版本的 eXist?

标签: xquery exist-db oxygenxml exide


【解决方案1】:

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

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

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

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

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

几个问题:

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

  2. 1234563将现有索引更改为rsc:doctitle,或在rsc:doctitle 上添加新索引,以便您可以查询其中一个。之后重新索引集合,并按照 Adam 的建议,检查 Monex 应用程序的索引窗格,以确保数据库已按预期应用了您的索引配置。

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

【讨论】:

  • 另外,您还没有正确声明 rsc 命名空间:&lt;index rsc="http://www.rsc.org/schema/rscart38"&gt; 应该是 &lt;index xmlns:rsc="http://www.rsc.org/schema/rscart38"&gt;。其余属性应删除;不过,您可能应该添加xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • 无论你建议我做什么,但我没有得到结果,每当我更改 conf 文件时,我都会重新索引集合,但我仍然得到零结果,下面是代码:
  • rsc.org/schema/rscart38">
  • xquery: 声明命名空间 rsc="rsc.org/schema/rscart38";让 $coll : = collection('/db/apps/test/RSC') 让 $hits := $coll//rsc:doctitle[ft:query(., 'studies')] 返回 $hits
  • 我也尝试通过删除 conf 文件中的“//”进行搜索,但仍然无法正常工作,我在哪里可以找到 Monex
【解决方案2】:

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

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

【讨论】:

  • 据我了解,Jens Østergaard Petersen 从 2016 年 4 月开始在存在开放 (markmail.org/message/jynggwbhrprek4m6) 上发表的一篇文章中,包括一个空的停用词元素会阻止 Lucene 应用其默认的停用词集(请参阅整个列表其中stackoverflow.com/questions/17527741/…)。
  • 感谢您的回复 Adam,每当我更改 conf 文件时,我都会重新索引集合,但我仍然得到零结果,我在哪里可以找到 Monex
  • Monex 可从 eXist-db 3.0-RC1 及更高版本仪表板中的包管理器安装
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
相关资源
最近更新 更多