Lucene.NET-在多个字段上进行AND搜索

Hun*_*yen 2 lucene lucene.net

我为我的产品实体定义了一个文档对象,该对象具有多个字段:标题,品牌,类别,大小,颜色,材料。

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

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

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

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

3.文档的类别=“男式衬衫”,品牌=“ gucci”,颜色=“红色”

4.等

我知道Lucene支持运算符+必须对搜索查询进行操作。例如,我可以翻译上面的关键字以查询“ + gucci + shirt + red”,那么我肯定上面示例(1)的文档将得到响应。但这是否适用于上述情况(2)和(3)?

Bar*_*cki 5

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

  • TermQuery :(完全匹配),有人键入标题的完全匹配项
  • PhraseQuery :(使用倾斜),因此,如果您使用“ Gucci衬衫红色”,并且有人输入“ Gucci衬衫”(请注意一个字距),则它将匹配
  • FuzzyQuery :(在大(> 5000万个记录)/非内存索引上速度较慢)以解决潜在的拼写错误
  • 布尔值SubQuery:所有术语都分开并进行或运算。匹配4个单词中的1个单词的查询得分较低,而3/4个单词的得分较高。
  • 查询解析(如上所述,具有潜在的字段提升功能)
  • 其他:即对短语等进行同义词搜索

我将对所有这些类型进行“或”运算,然后使用“收集器”最低分数将它们过滤掉。

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

性能: 我已经使用Lucene 3.0.x对具有> 100M记录但不​​在内存中的索引进行了这样的查询,并且它可以很快地给出亚秒级响应。Fuzzy Query会使速度变慢,但是如前所述,可以将其设置为高级搜索选项(或“使用...再次搜索”)。