我正在使用solr为我的工作,它是优秀的。然而,我在生成更详细的搜索结果时遇到了麻烦。
我正在按标题、品牌、性别和类别(正装鞋、夹克等)搜索产品。品牌位于"Brands"DB表中,类别和性别也是如此。产品位于"Products"DB表中,该表与Brands、Categories和gender表具有外键。
我正在将所有这些加载到solr中,并且我可以毫不费力地在它们之间进行加权排序搜索。这将给出最相似的产品,按某些字段称重。接下来我要做的是找到精确匹配从每个字段为任何搜索字符串。例如:
搜索字符串:"Michael Kors浅绿色男士正装鞋"
应该匹配:
品牌:
- Michael Kors
颜色:
- 亮绿色 绿色
- 犯罪
类别:
- 正装鞋 鞋子
然后我可以做一个更严格但分类的相交搜索。例如,所有产品都是[浅绿色]和[michael kors]和[正装鞋或皮鞋]
谢谢:)
您可以尝试布尔查询布尔查询包含多个子句。
http://localhost:8983/solr/query?q=(Brands:"Michael Kors") AND (Colours:"Light Green") AND (Category:(Dress Shoes OR Shoes))
可以将模式字段从文本更改为字符串。这将给你精确匹配-但在必须自己处理大写/小写的扩展。
Dismax和Edismax解析器将为您提供跨多个字段搜索的最简单选项。
这实际上是一个关于"文本标记"(有时也称为"命名实体识别")的问题。
在你所追求的上下文中,Daniel Tunkelang认为这是"查询理解"的重要组成部分。
Lucene有一些数据结构可以用来实现这类功能(参见OpenSextant项目作为一个例子),但是Solr没有提供这个功能(除了使用上面描述的shingles的近似解决方案)。
这很难的原因是,在运行查询之前,您需要查询中每个术语/短语的文档频率信息,跨越您关心的每个字段 !。
缓慢,不优雅的Solr解决方案:
如果你想运行两个查询,你可以使用facet来接近你的目标:
- 运行正常文本字符串查询Q1:请求品牌,颜色,性别和类别的术语面(存储为字符串)
- 将Q1分拆为1期和2期。
- 将您的Q1查询块与Q1结果中请求的每个字段返回的顶级facet值进行比较。
- 每当你看到一个精确匹配,应用你的交叉过滤器到一个新的查询,Q2:原始查询Q1加上你的新的,限制性的标准。
- 运行Q2
(这里的一个很好的副作用是,您的查询更窄的将能够在构造Q2时看到从Q1返回的总计数和facet计数,因此如果匹配结果的数量下降得太低,您可以决定省略/放松某些限制)