【问题标题】:Solr search for exact phrase / substringSolr 搜索确切的短语/子字符串
【发布时间】:2015-12-25 11:49:14
【问题描述】:

我在工作中使用 solr,它非常棒。但是,我无法生成更详细的搜索结果。

我正在按名称、品牌、性别和类别(正装鞋、夹克等)搜索产品。品牌存在于“品牌”数据库表中,类别和性别也是如此。产品存在于“产品”数据库表中,该表是品牌、类别和性别表的外键。

我正在将所有这些加载到 solr 中,我可以毫无困难地对它们进行加权排名搜索。这将给出最相似的产品,按某些领域进行权衡。我接下来要做的是从每个字段中找到任何搜索字符串的完全匹配项。例如:

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

应该匹配:

品牌:

  • 迈克尔·科尔斯

颜色:

  • 浅绿色
  • 绿色

性别:

  • 男士

类别:

  • 正装鞋
  • 鞋子

然后我可以进行更严格但分类的相交搜索。例如。 [浅绿色] AND [michael kors] AND [Dress Shoes OR Shoes]的所有产品

谢谢:)

【问题讨论】:

标签: mysql search solr edismax dismax


【解决方案1】:

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

在您追求的上下文中,Daniel Tunkelang 认为这是"Query Understanding" 的重要组成部分。

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

这很难做到的原因是,您需要在查询中的每个术语/短语、您关心的每个字段中记录频率信息,在您运行查询之前!


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

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

  1. 运行普通文本字符串查询 Q1:请求有关品牌、颜色、性别和类别的术语方面(存储为字符串)
  2. 将 Q1 标记为 1 项和 2 项带状疱疹。
  3. 将您的 Q1 查询 shingles 与 Q1 结果中请求的每个字段返回的 top facet 值进行比较。
  4. 每当您看到完全匹配时,将相交过滤器应用于新查询 Q2:原始查询 Q1 加上您的新限制条件。
  5. 运行 Q2

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

【讨论】:

    【解决方案2】:

    您可以将架构字段从文本更改为字符串。这会给你完全匹配 - 但在必须自己处理大写/小写的范围内。

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

    【讨论】:

    • 虽然听起来像是正确的解决方案,但字符串类型似乎对我们不起作用
    • 字符串不适用于 EDisMax。也就是说,整个查询必须与索引值完全匹配。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • @mils :没听明白吗?究竟是什么问题?
      • 我不知道如何更好地解释它。我们希望找到用户查询的精确子字符串匹配。例如。 “男士浅绿色鞋”将返回颜色“浅绿色”和“绿色”,而不是“浅蓝色”
      • 在这种情况下,您需要检查如何构建相同的 fieldType..尝试使用 ShingleFilterFactory...阅读更多关于wiki.apache.org/solr/…
      • 我认为这没有意义。如果我们使用 2 的最小 shingle,我们将不会匹配“green”,只会匹配“light green”,这不是我们想要的
      • 尝试拥有 2 个字段,并且这两个字段都由不同的 fieldType 索引。一个 fieldType 具有 shinglefilter 和另一个 fieldType 具有空格标记器的字段...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多