首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene查询排列

Lucene查询排列
EN

Stack Overflow用户
提问于 2010-02-09 11:05:24
回答 2查看 462关注 0票数 1

我有一个关于执行涉及排列的lucene查询的问题。

假设我有两个字段:"name“和"keyword”,用户搜索"joes pizza restaurant“。我希望该搜索的一些部分,以匹配“名称”字段的完整内容和一些部分,以匹配关键字字段的完整内容。它应该匹配所有提供的术语,并且应该匹配字段的全部内容。例如,它可以匹配:

1)名称:“joes restaurant”关键词:“披萨”

2)名称:“joes pizza”关键词:“restaurant”

3)名称:“披萨餐厅”关键词:“joes”

4)名称:“披萨”关键词:“joes restaurant”

5)名称:“披萨乔斯”关键词:“餐厅”

但它不会匹配

6)名字:“big joes restaurant”关键词:“披萨”--因为它不是全场的匹配

7)名称:“joes披萨餐厅”关键字:“nomatch”-因为至少有一个术语应该与关键字字段匹配

我已经考虑过通过计算字段的所有排列并使用布尔查询来实现这一点的可能方法,但是,随着术语数量的增加,这种方法的伸缩性不是很好。有没有人知道如何高效地实现这种查询?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-09 18:57:58

Lucene文档建议使用单独的字段,这是跨多个字段的查询的'name‘和'keyword’字段的串联。在此字段上执行搜索。

票数 1
EN

Stack Overflow用户

发布于 2010-02-09 17:08:01

让我们将您的查询分为三个部分:

  1. 'name‘字段和'keyword’字段都应该包含查询的一部分。
  2. 两个匹配项都应该是完整的字段。
  3. 匹配项的联合应该完全覆盖查询。

我会这样实现它:

  1. 创建由原始查询中的标记组成的布尔查询。使其成为“必须”术语的析取。例如,在这个示例中,类似于:

(name:joes OR name:restaurant OR name:pizza) AND (keyword:joes OR keyword:restaurant OR keyword:pizza)任何与此查询匹配的文档在每个字段中都包含原始查询的一部分。(为了节省时间,这可能是一个ConstantScoreQuery )。

  • 从第一个查询中获取一组匹配项。提取字段内容作为标记,并将其存储在字符串集中。只保留其中集合的并集等于原始查询中的字符串集的匹配,并且这些集合有一个空的交集。(这处理上面的covering - item 3)。对于您的第一个示例,我们将使用集合{"joes","restaurant"}和{“conditions.

  • Take”}来满足剩余匹配的集合大小,并将它们与字段长度进行比较。对于您的第一个示例,我们将设置大小为2和1,这应该与字段长度2和1 respectively.

相对应

注意,我的项目2和3不是常规Lucene评分的一部分,而是外部Java代码的一部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2226485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档