Solr搜索精确的短语/子字符串



我正在使用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来接近你的目标:

  1. 运行正常文本字符串查询Q1:请求品牌,颜色,性别和类别的术语面(存储为字符串)
  2. 将Q1分拆为1期和2期。
  3. 将您的Q1查询块与Q1结果中请求的每个字段返回的顶级facet值进行比较。
  4. 每当你看到一个精确匹配,应用你的交叉过滤器到一个新的查询,Q2:原始查询Q1加上你的新的,限制性的标准。
  5. 运行Q2

(这里的一个很好的副作用是,您的查询更窄的将能够在构造Q2时看到从Q1返回的总计数和facet计数,因此如果匹配结果的数量下降得太低,您可以决定省略/放松某些限制)

相关内容

  • 没有找到相关文章