【问题标题】:Hints on implementing XQuery full-text search using Lucene使用 Lucene 实现 XQuery 全文搜索的提示
【发布时间】:2010-01-14 17:44:26
【问题描述】:

我在之前的项目中使用过 Lucene,所以我对 API 有点熟悉。但是,我从来不需要做任何“花哨”的事情(其中“花哨”意味着使用过滤器、不同的分析器、提升、有效负载等)。

我即将着手实现 XQuery 的全文搜索功能:

http://www.w3.org/TR/xpath-full-text-10/

它的查询能力是我见过的最复杂的。根据我使用 Lucene 的经验,我知道它可以用来实现一些特性;但是,我想遍历它们。对于每个功能,我只需要一个简单的答案,例如“功能 X 最好使用查询过滤器来实现”,这样我才能从每个功能的正确方向开始。

注意:我将实现自己的查询解析器,并使用 Lucene 类的各种实例“手动”构建查询。

3.3 基数选择

这让你可以说:

title ftcontains "usability" occurs at least 2 times

这意味着标题字段必须至少包含两次“可用性”。如何做到这一点?

3.4.4 词干选项

这允许您将已编入索引的单词与查询中的词干进行匹配,例如:

title ftcontains "improve" with stemming

即使标题包含“改进”也会匹配。请注意,不能使用 PorterStemFilter,因为是否使用词干提取的决定是在查询时而不是索引时指定的。

在这种情况下,我是否必须将每个单词添加到索引中两次?一次用于原始词,一次用于词干词(假设词干词与原始词不同)?还是有更好的办法?

3.4.5 案例选项

这允许您在查询时指定“不区分大小写”、“区分大小写”、“小写”、“大写”之一。

我认为最后两个可以使用查询过滤器来实现,因为对于“小写”,它仅在文档文本全部为小写时才匹配(对于“大写”也是如此)。

但是,您将如何处理不区分大小写/区分大小写的规范?一种想法是将每个单词添加两次:一次以原始大小写,一次以标准化大小写(任意选择为小写)。有更好的想法吗?

3.4.6 变音符号选项

这类似于 Cast Option,除了它的“变音符号不敏感”或“变音符号敏感”。如何实现呢?

3.4.7 停用词选项

这允许您指定--qt 查询时间--“带停用词”,例如:

abstract ftcontains "propagating of errors"
with stop words ("a", "the", "of")

将匹配包含“传播少量错误”的摘要的文档。这似乎很奇怪,我知道。就好像停用词变成了通配符,即:

"propagating of errors" -> "propagating * errors"

其中 * 将匹配文档中的任何单词。这如何在 Lucene 中实现?

3.5.3 轻度-非选择

XQuery 有两种类型的“非”:(常规)非和轻度非。这使您可以进行如下查询:

body ftcontains "Mexico" not in "New Mexico"

只有当它不是短语“New Mexico”的一部分时,它才会匹配包含“Mexico”的文档。我猜你可以为此使用查询过滤器,是吗?

3.6.1 有序选择

这允许您要求查询中的单词顺序与文档中单词的顺序相匹配,例如:

title ftcontains ("web site" ftand "usability") ordered

只有当短语“web site”和单词“usability”都出现在文档中并且“usability”按单词顺序出现在“web site”之后时才会匹配。 Lucene SpanQuery 类必须可以访问单词位置,是吗?您如何访问这些?

3.6.4 范围选择

这允许您要求单词出现在相同的“范围”中,例如:

abstract ftcontains "usability" ftand "web site" same sentence

你也可以任意组合{same|different} {sentence|paragraph}。我对此的猜测也是跟踪有效载荷中的句子/段落数据。是吗?

3.7 忽略选项

给定部分 XQuery:

let $x := <book>
  <title>Web Usability and Practice</title>
  <author>Montana <annotation> this author is
      an expert in Web Usability</annotation> Marigold
  </author>
  <editor>Vera Tudor-Medina on Web <annotation> best
      editor on Web Usability</annotation> Usability
  </editor>
</book>

如果我有疑问:

book ftcontains "Web Usability" without content $x//annotation

那么它根本不会考虑元素内的任何文本。 “Web 可用性”会出现两次:一次在标题元素中,一次在编辑器元素中。请注意,后一个元素恰好出现在“Web 可用性”这个短语的中间。我对此的猜测也是使用有效负载数据来存储每个单词所在的元素,然后使用基于此的过滤器。是吗?


我意识到这很多,但任何指针表示赞赏。谢谢!

【问题讨论】:

    标签: lucene xquery


    【解决方案1】:

    您可能有兴趣查看我刚刚在 GitHub 上发布的 Lux 项目:https://github.com/msokolov/lux。它集成了 Saxon XQuery 处理器和 Lucene/Solr,通过 XQuery 提供全文搜索功能。我采用的方法是提供一个直接公开 Lucene 查询功能的搜索功能,而不是像这样实现 XQuery 全文。但是,我相信 xqft 可以使用类似的方法来实现。 Lux 包括两种索引:路径索引(包括 oelement 和属性名称)和文本索引,其中包括节点名称作为令牌文本的一部分(不在有效负载中)。这使得使用现有的 Lucene 查询变得容易。

    但是为了更好地回答您的问题:我很确定可以使用带有大斜率的 SpanNearQuery 来实现 3.3。

    对于 3.4、3.5、3.6 和 3.7:为了允许查询时分析选择(如词干提取、区分大小写等),有两种可能性:创建多个字段,每个字段用于分析选项的选择,或为每个分析选项组合在同一位置添加多个标记。但是,对于第二个选项,您还需要向每个令牌添加一些信息,以指示用于创建它的分析设置,而 Lucene 不会在那里为您提供任何帮助 - 您必须使用诸如添加有效负载或前缀之类的技巧以某种方式使用术语文本。

    嗯 - 刚刚注意到这个问题是 2 年前提出的,但从未回答过。嗯 - 这显然是一个大项目!

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2012-12-19
      相关资源
      最近更新 更多