3

我在之前的项目中使用过 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

仅当短语“网站”和“可用性”一词都出现在文档中并且“可用性”按字序排列在“网站”之后时才会匹配。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 可用性”这个短语的中间。我对此的猜测也是使用有效负载数据来存储每个单词所在的元素,然后使用基于此的过滤器。是的?


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

4

1 回答 1

1

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

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

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

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

于 2013-01-26T21:21:27.053 回答