2

我为我的产品实体定义了一个 Document 对象,它有几个字段:Title、Brand、Category、Size、Color、Material。

现在我想支持用户对多个字段进行 AND 搜索。任何有一个、两个或多个字段包含所有搜索词的文档都将被响应。

例如,当用户输入“gucci shirt red”时,我想返回所有字段与所有 3 个标记“gucci”、“shirt”和“red”匹配的文档。所以下面的所有文件都会得到回复:

1.带有标题的文档包含所有3个单词,例如Title =“Gucci Modern Shirt Red”或“Gucci blue shirt”...

2.标题=“Gucci 古典衬衫”和颜色=“红色”的文档

3.Category = "mens shirt" AND Brand = "gucci" AND Color = "red" 的文档

4.等等..

我知道 Lucene 支持运算符 + 必须执行搜索查询。比如我可以把上面的关键词翻译成查询“+gucci +shirt +red”,那么我相信上面例子(1)的文档肯定会得到响应。但它适用于上述情况(2)和(3)吗?

4

3 回答 3

7

在执行这些类型的查询时,我喜欢:创建一个主 BooleanQuery 并添加几个协同工作以提供最佳结果的子查询

  • TermQuery:(完全匹配),有人输入的标题完全匹配
  • PhraseQuery:(使用 slop),所以如果你有“Gucci Modern Shirt Red”并且有人输入“Gucci Shirt”(注意一个单词间隙)它会匹配
  • FuzzyQuery:(在大型(> 5000 万条记录)/非内存索引上很慢)以解决潜在的拼写错误
  • 布尔子查询:所有的术语都被分隔和 OR'ed。与 4 个单词中的 1 个匹配的查询得分较低,但 3/4 个单词得分较高。
  • 查询解析(如上所述,具有潜在的字段提升)
  • 其他:即对短语等进行同义词搜索。

我会 OR 所有这些类型,然后使用收集器最低分数将它们过滤掉。

我喜欢主要的 BooleanQuery 方法的原因是您可以设置用户选择查询的“类型”。可能很简单 -> 高级,并且可以很容易地快速添加/删除查询类型,并且可以很容易地构建查询并给出预测结果。提高您在内部 Lucene 算法中工作的记录/相似性,结果有时不清楚。

性能: 我已经使用 Lucene 3.0.x 对超过 100M 记录不在内存中的索引进行了这样的查询,并且它的工作速度非常快,可以提供亚秒级的响应。模糊查询确实会减慢速度,但如前所述,可以将其设置为高级搜索选项(或“使用...再次搜索”)

于 2013-10-08T18:33:07.150 回答
3

不,当没有在查询中明确搜索字段时,它将转到默认字段,在您的情况下,它将显示为“标题”。您需要一个更像是的查询:

+shirt +color:red +brand:gucci

例如。

或者,一种常见的用法是设置一个捕获所有字段,其中所有(或大部分)可搜索数据混合在一起,允许您在该字段上以非常松散的方式搜索所有内容,在这种情况下,您可以只需使用类似的东西:

all:(+shirt +gucci +red)

或者,如果您将该字段设为默认字段:

+shirt +gucci +red

正如你所指出的。

于 2013-10-07T17:01:57.810 回答
1

您可以使用 MultiFieldQueryParser。添加标题、颜色、品牌等。

如果您搜索“gucci shirt red”,那么使用上面的 Parser 将返回查询,例如

+((标题:gucci 颜色:gucci 品牌:gucci) (标题:衬衫 颜色:衬衫 品牌:衬衫) (标题:红色 颜色:红色 品牌:红色)

这应该可以解决问题。

此外,如果您想这样说,对于上述查询,您想展示品牌与 gucci 产品的第一个展示,那么您可以对该字段应用 boost。

于 2013-10-08T11:40:53.540 回答