我在以前的项目中使用过Lucene,所以我对API有点熟悉。但是,我从来没有做过任何“幻想”的事情(其中“花哨”意味着使用过滤器,不同的分析器,增强,有效载荷等)。
我即将开始实现XQuery的全文搜索功能:
http://www.w3.org/TR/xpath-full-text-10/
它的查询能力是我见过的最复杂的。根据我对Lucene的经验,我知道它可以用来实现一些功能;但是,我想全面介绍它们。对于每个功能,我只需要一个简单的答案,例如“功能X最好使用查询过滤器实现”,这样我就可以从每个功能的正确方向开始。
注意:我将实现自己的查询解析器,并使用各种Lucene类实例化“手动”构建查询。
这允许你说:
title ftcontains "usability" occurs at least 2 times
表示标题字段必须包含“可用性”至少两次。怎么办呢?
这允许您将已编入索引的单词与查询中已被删除的单词进行匹配:
title ftcontains "improve" with stemming
即使标题包含“改进”,也会匹配。请注意,无法使用PorterStemFilter,因为决定是否使用词干是在查询时而不是索引时指定的。
在这种情况下,我是否必须将每个单词添加到索引两次?一次用于原始单词,一次用于词干(假设词干与原始单词不同)?或者有更好的方法吗?
这允许您在查询时指定“不区分大小写”,“区分大小写”,“小写”,“大写”之一。
我认为最后两个可以使用查询过滤器来实现,因为对于“小写”,仅当文档文本全部为小写(并且“大写”相同)时,它才匹配。
但您如何处理不区分大小写/敏感的规范?一种想法是将每个单词添加两次:一次在原始情况下,一次在标准化情况下(任意选择,例如,小写)。有更好的想法吗?
这类似于Cast选项,除了它的“变音符号不敏感”或“变音符号敏感。如何实现它?
这允许您指定 - qt查询时间 - “带停用词”,例如:
abstract ftcontains "propagating of errors"
with stop words ("a", "the", "of")
会将文档与包含“传播少量错误”的摘要进行匹配。我知道,这看起来很奇怪。好像停用词变成了通配符,即:
"propagating of errors" -> "propagating * errors"
其中*将匹配文档中的任何单词。如何在Lucene中实现?
XQuery有两种“not”:(常规)not和mild-not。这允许您进行如下查询:
body ftcontains "Mexico" not in "New Mexico"
只有当“墨西哥”不属于“新墨西哥”这一短语时,才能匹配包含“墨西哥”的文件。我猜你可以使用查询过滤器,是吗?
这允许您要求查询中单词的顺序与文档中单词的顺序相匹配,例如:
title ftcontains ("web site" ftand "usability") ordered
只有在文档中出现短语“网站”和“可用性”这两个词时才会匹配,并且“可用性”按字顺序出现在“网站”之后。 Lucene SpanQuery类必须能够访问单词位置,是吗?你如何访问这些?
这允许您要求单词出现在相同的“范围”中,例如:
abstract ftcontains "usability" ftand "web site" same sentence
你也可以{same | different} {sentence | paragraph}的任意组合。我对此的猜测也是跟踪有效载荷中的句子/段落数据。是
鉴于部分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可用性”将被发现两次:一次在title元素中,一次在editor元素中。请注意,后一个元素出现在短语“Web Usability”的中间。我对此的猜测也是使用有效载荷数据来存储每个单词所在的元素,然后使用基于此的过滤器。是
我意识到这很多,但任何指针都表示赞赏。谢谢!
答案 0 :(得分:1)
您可能有兴趣查看我刚刚在GitHub上发布的Lux项目:https://github.com/msokolov/lux。它集成了Saxon XQuery处理器和Lucene / Solr,通过XQuery提供全文搜索功能。我采用的方法是提供一个直接暴露Lucene查询功能的搜索功能,而不是像这样实现XQuery全文。但是,我相信xqft可以使用类似的方法实现。 Lux包括两种索引:路径索引(包括元素和属性名称)和文本索引,其中包括节点名称作为令牌文本的一部分(不在有效负载中)。这样可以轻松使用现有的Lucene查询。
但是要更好地回答你的问题:我很确定3.3可以使用具有大斜率的SpanNearQuery来实现。
对于3.4,3.5,3.6和3.7:为了允许查询时分析选择(如词干,区分大小写等),有两种可能:创建多个字段,每个字段用于每个分析选项,或为每个分析选项组合在同一位置添加多个令牌。但是使用第二个选项,您还需要向每个令牌添加一些信息以指示用于创建它的分析设置,Lucene在那里没有给您任何帮助 - 您必须玩诸如添加有效负载或前缀之类的黑客文字一词不知怎的。
嗯 - 刚才注意到这个问题是2年前被问到的,但从未回答过。嗯 - 这显然是一个大项目!