Solr搜索精确短语/子串

时间:2015-09-28 09:23:04

标签: mysql search solr edismax dismax

我正在使用solr来完成我的工作而且非常棒。但是,我无法生成更精细的搜索结果。

我正在寻找他们的产品名称,品牌,性别和类别(礼服鞋,夹克等)。品牌生活在“品牌”数据库表中,类别和性别相同。产品位于“产品”数据库表中,该表是外键,可用于品牌,类别和性别表。

我将所有这些加载到solr中,我可以毫不费力地进行加权排名搜索。这将给出最相似的产品,受某些领域的影响。我想要做的是下一步是找到任何搜索字符串的每个字段的完全匹配。例如:

搜索字符串:“Michael Kors浅绿色男士礼服鞋”

应该匹配:

品牌:

  • Michael Kors

颜色

  • 浅绿色
  • 绿色

性别:

  • 男装

类别:

  • 礼服鞋
然后,我可以做一个更严格的 - 但是分类 - 相交搜索。例如。所有产品[浅绿色]和[迈克尔科尔斯]和[礼服鞋或鞋子]

谢谢:)

4 个答案:

答案 0 :(得分:0)

您可以尝试使用布尔查询 布尔查询包含多个子句。

http://localhost:8983/solr/query?q=(Brands:"Michael Kors") AND (Colours:"Light Green") AND (Category:(Dress Shoes OR Shoes))

答案 1 :(得分:0)

@mils 更多寻找搜索结果,您应该考虑使用不同的查询解析器。如果任何可用的查询解析器适合您,我认为此链接值得一读。 https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-TermsQueryParser

答案 2 :(得分:0)

您可以将架构字段从文本更改为字符串。那会给你完全匹配 - 但是你必须自己处理上/下的情况。

Dismax和Edismax解析器将为您提供搜索多个字段的最简单选项。

答案 3 :(得分:0)

这实际上是关于“文本标记”的问题(有时也称为“named entity recognition”)。

在你所追求的背景下,Daniel Tunkelang认为这是"Query Understanding"的重要组成部分。

Lucene有一些可用于实现此类功能的数据结构(请参阅OpenSextant project作为示例),但Solr不提供此功能(超出使用上述带状疱疹的近似解决方案)

这很难的原因是,在运行查询之前,您需要在您关注的每个字段中查询查询中每个术语/词组的文档频率信息!

缓慢,不优雅的Solr解决方案:

如果您愿意运行两个查询,则可以使用构面近似您的目标:

  1. 运行普通文本字符串查询Q1:请求品牌,颜色,性别和类别的术语构面(存储为字符串)
  2. 将Q1标记为1期和2期的带状疱疹。
  3. 将Q1查询带状疱疹与Q1结果中请求的每个字段返回的顶面值进行比较。
  4. 每当您看到完全匹配时,请将相交过滤器应用于新查询,Q2:原始查询Q1以及新的限制性条件。
  5. 运行Q2
  6. (这里一个很好的副作用是你的查询更窄将能够在构造Q2时看到从Q1返回的总计数和方面计数,所以你可以决定省略/放松某些限制应该匹配结果的数量下降得太低)