Lucene.NET-执行搜索并在多个字段中搜索多个单词

Lucene.NET-执行搜索并在多个字段中搜索多个单词,lucene,lucene.net,Lucene,Lucene.net,我为我的产品实体定义了一个文档对象,它有几个字段:标题、品牌、类别、大小、颜色、材质 现在,我想支持用户在多个字段上进行搜索。任何包含一个、两个或多个字段且包含所有搜索词的文档都将被响应 例如,当用户输入“gucci shirt red”时,我希望返回所有字段与所有3个标记“gucci”、“shirt”和“red”匹配的文档。因此,以下所有文件都将得到响应: 1.带标题的文档包含所有3个单词,例如title=“Gucci Modern Shirt Red”或“Gucci blue Shirt”

我为我的产品实体定义了一个文档对象,它有几个字段:标题、品牌、类别、大小、颜色、材质

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

例如,当用户输入“gucci shirt red”时,我希望返回所有字段与所有3个标记“gucci”、“shirt”和“red”匹配的文档。因此,以下所有文件都将得到响应:

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

2.标题为“Gucci经典衬衫”且颜色为“红色”的文件

3.带有Category=“mens shirt”和Brand=“gucci”以及Color=“red”的文档

四,等等


我知道Lucene支持operator+,它是搜索查询的必备工具。例如,我可以将上面的关键字翻译成查询“+gucci+shirt+red”,那么我确信上面示例(1)中的文档肯定会得到响应。但是它对上述案例(2)和(3)有效吗?

否,如果查询中没有指定要显式搜索的字段,它将转到默认字段,该字段将显示为案例中的“标题”。您需要的查询更像:

+shirt +color:red +brand:gucci
比如说

或者,一个常见的用法是设置一个“全包”字段,其中所有(或一个较大的子集)可搜索数据都被混合在一起,允许您以非常松散的方式在该字段上搜索所有内容,在这种情况下,您只需使用如下内容:

all:(+shirt +gucci +red)
或者,如果您将该字段改为默认字段:

+shirt +gucci +red

正如您所指出的。

您可以使用多字段QueryParser。添加标题、颜色、品牌等

若您搜索“gucci shirt red”,那个么使用上述解析器将返回如下查询

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

这应该可以解决问题


另外,如果您想这样做,比如说,对于上面的查询,您希望首先显示gucci产品的品牌,那么您可以将boost应用于此字段。

在执行这些类型的查询时,我喜欢:创建一个主布尔查询,并添加几个子查询,这些子查询一起工作以获得最佳结果。

  • 术语查询:(精确匹配),有人键入标题的精确匹配项
  • 短语查询:(使用slop),因此,如果您有“Gucci Modern Shirt Red”,并且有人键入“Gucci Shirt”(注意一个单词的间距),那么它将匹配
  • FuzzyQuery:(大型(>5000万条记录)/非内存索引速度较慢)来解释潜在的拼写错误
  • 布尔子查询:所有术语都被分隔和或。匹配1/4个单词的查询得分较低,但3/4个单词的得分较高
  • 查询解析(如上所述,具有潜在的字段提升功能)
  • 其他:即对短语等进行同义词搜索
我会选择一个或所有这些类型,然后使用收集器最低分数过滤掉它们

我喜欢master BooleanQuery方法的原因是您可以设置一个用户选择“类型”的设置查询。可能是简单->高级,很容易在运行中快速添加/删除查询类型,并且可以很容易地生成查询,从而产生预测结果。在内部Lucene算法中增加记录/相似性,结果有时不清晰


性能:我使用Lucene 3.0.x在内存中没有超过100M条记录的索引上进行过类似的查询,它的工作速度非常快,可以给出亚秒级的响应。模糊查询确实会减慢速度,但如前所述,它可以成为高级搜索选项(或“再次搜索…”)

问题是我无法设置搜索任何特定字段,因为我不知道搜索哪个字段的单词,用户可以按任何顺序输入任何关键字,例如用户可以输入“shirt gucci”需要明确的是,因为我不知道哪个单词应该与哪个字段匹配,所以如果:对于每个关键字标记,无论字段是什么,我都可以找到与之匹配的字段,例如:单词“shirt”可以与字段类别或标题栏匹配,这就是为什么在所有可搜索内容上创建一个
all
字段是合适的。索引一个all字段以及特定字段允许您搜索所有相关内容,并在必要时处理更具体的搜索。您的“all”字段不应存储,其他字段可能会存储,也可能不会存储。很好,我明白你的意思。非常感谢Femtorgon你所说的术语查询是什么意思?