首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Lucene.NET -在多个字段上执行和搜索多个单词

Lucene.NET -在多个字段上执行和搜索多个单词
EN

Stack Overflow用户
提问于 2013-10-07 16:52:52
回答 3查看 5.4K关注 0票数 2

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

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

例如,当用户输入"gucci恤红色“时,我希望返回与所有3个标记"gucci”、“恤”和“红色”匹配的所有文档。因此,以下所有文件将得到答复:

1.带有标题的文件包含所有三个字,例如标题= "Gucci现代衬衫红色“或"Gucci蓝色衬衫”.

2.标题=“古驰经典衬衫”和颜色=“红色”的文件

3.类别=“男衬衫”及“品牌”=“古驰”及“颜色=红色”的文件

4.等

我知道Lucene支持操作符+用于搜索查询。例如,我可以将上面的关键字翻译成查询"+gucci +恤+red“,然后我确信上面示例(1)的文档一定会得到响应。但对上述(2)和(3)类情况是否有效?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-07 17:01:57

不,如果没有在查询中指定要显式搜索的字段,它将转到默认字段,在您的情况下,该字段将显示为"title“。您需要一个更像这样的查询:

代码语言:javascript
运行
复制
+shirt +color:red +brand:gucci

例如。

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

代码语言:javascript
运行
复制
all:(+shirt +gucci +red)

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

代码语言:javascript
运行
复制
+shirt +gucci +red

就像你说的。

票数 3
EN

Stack Overflow用户

发布于 2013-10-08 18:33:07

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

  • TermQuery: (精确匹配),有人键入标题的精确匹配
  • PhraseQuery: (使用slop),所以如果你有"Gucci现代衬衫红色“而有人键入"Gucci恤”(注意一个单词间隙),它就会匹配。
  • FuzzyQuery:用于解释潜在拼写错误的(>5000万条记录)/非内存索引。
  • Boolean :所有术语分离的和OR‘’ed。查询匹配1,我们的4个单词会有低分数,而3/4个单词将有一个较高的分数。
  • 查询解析(如上文所述,有潜在的字段增强)
  • Other:,即同义词、短语搜索等。

我将或所有这些类型,然后过滤出来,使用收集器最低得分。

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

Performance: --我使用Lucene3.0.x在内存中记录超过100 m的索引上进行了类似的查询,它的工作速度很快,给出了次秒响应。模糊查询确实会减慢速度,但如前所述,可以将其转换为高级搜索选项(或“使用.重新搜索”)。

票数 7
EN

Stack Overflow用户

发布于 2013-10-08 11:40:53

你可以用MultiFieldQueryParser。添加标题,颜色,品牌等。

如果您搜索"gucci恤红色“,那么使用上面的Parser将返回如下查询

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

这应该能解决这个问题。

另外,如果你想要,比如说,对于上面的查询,你想用gucci产品来显示品牌,然后你可以应用到这个领域。

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

https://stackoverflow.com/questions/19230403

复制
相关文章

相似问题

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