2

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

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

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

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

应该匹配:

品牌:

  • 迈克尔·科尔斯

颜色:

  • 浅绿色
  • 绿色的

性别:

  • 男士

类别:

  • 礼服鞋

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

谢谢 :)

4

4 回答 4

1

这确实是一个关于“文本标记”(有时也称为“命名实体识别”)的问题。

在您所追求的上下文中,Daniel Tunkelang 认为这是“查询理解”的重要组成部分。

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

这很难,因为在运行查询之前,您需要查询中每个术语/短语的文档频率信息,跨越您关心的每个字段!.


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

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

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

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

于 2015-10-01T03:39:41.850 回答
1

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

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

于 2015-09-29T11:31:58.183 回答
1

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

于 2015-09-28T19:18:25.460 回答
1

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

http://localhost:8983/solr/query?q=(Brands:"Michael Kors") AND (Colours:"Light Green") AND (Category:(Dress Shoes OR Shoes))
于 2015-09-28T09:32:11.203 回答