2015-09-28 90 views
0

我正在使用solr作为我的工作,而且非常出色。但是,我无法生成更精细的搜索结果。Solr搜索精确的短语/子字符串

我正在寻找产品的标题,品牌,性别和类别(正装鞋,夹克等)。品牌生活在“品牌”数据库表中,类别和性别也相同。产品存在于“产品”数据库表中,该表与外部品牌,类别和性别表相关。

我将所有这些加载到solr中,并且我可以在没有问题的情况下进行加权排名搜索。这将给予最相似的产品,由某些领域权衡。我想接下来要做的是从任何搜索字符串的每个字段查找精确匹配。例如:

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

应符合:

品牌:

  • Michael Kors的

颜色:

  • 浅绿色
  • 绿色

性别:

  • 男装

类别:

  • 时装鞋

然后,我可以做一个更严格的 - 但分类 - 相交搜索。例如。这是[浅绿色]和[Michael Kors的]和[服饰鞋或皮鞋]

谢谢:)所有产品

+0

我认为这是相关的: https://stackoverflow.com/questions/12395990/exact-field-search-with-solr-lucene – mils

+0

我'米努力理解为什么这是如此困难 – mils

回答

0

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

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

我不知道什么品牌/颜色/类别将提前... – mils

+0

@mils:没有得到你?究竟是什么问题? –

+0

我不知道如何更好地解释它。我们想要查找用户查询的确切子字符串匹配。例如。 “男士浅绿色鞋”将返回颜色“浅绿色”和“绿色”,而不是“浅蓝色” – mils

0

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

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

+0

虽然听起来像是正确的解决方案,但字符串类型似乎没有为我们工作 – mils

+0

字符串不适用于EDisMax。也就是说,ENTIRE查询必须完全匹配索引值。 – mils

0

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

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

Lucene有一些数据结构可以用来实现这种功能(参见OpenSextant project作为例子),但Solr不提供这个功能(除了使用上述带状疱疹的近似解决方案之外)。

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


慢,不雅Solr的解决方案:

如果你愿意跑2个查询,可以近似用你的目标方面:

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

(一个不错的这里的副作用是,你查询窄就能看到总数量和小计数,同时构建Q2从Q1返回,这样你就可以决定省略/放松一定的限制,如果匹配结果数量下降太低)