我在之前的项目中使用过 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 可用性”这个短语的中间。我对此的猜测也是使用有效负载数据来存储每个单词所在的元素,然后使用基于此的过滤器。是的?
我意识到这很多,但任何指针表示赞赏。谢谢!