【问题标题】:Complex query for searching in solr在 solr 中搜索的复杂查询
【发布时间】:2014-03-18 10:31:12
【问题描述】:

我们在 solr 搜索引擎中以以下格式存储产品实体的数据。

{

id:unique_id,

...

...

...

price_per_quant: [
   "1-50|1",/* here price per quantity is save in key value pari e.g for quantity 1 to 50 price should be 1*/
   "51-100|2",
   "101-150|3",
   "151-200|4"
]


}

我需要关注的情况

  • 如果我搜索数量 20,那么应该会显示以上结果。
  • 如果我搜索价格 1,则应显示以上结果。
  • 如果我搜索价格 3 和数量 60 那么上面的结果应该 不显示。

还有一件事:我如何管理那些 price_per_quant 字段的构面搜索?

我正在使用 Solarium-project php 库来连接 solr。

【问题讨论】:

  • price_per_quant 的设计方式,我怀疑它是否会给您任何查询选项。如果我是你,我会重新设计架构。由于我不知道您的所有查询要求、您的其他文档的外观以及其他文档是否具有相同的范围,因此我不建议对其进行修改。
  • 所以你的意思是为了管理 price_per_quant 我们需要创建另一个模式??我说得对吗
  • 不是另一个架构。您应该修改现有架构以另一种方式索引该字段,可能作为动态字段。
  • @arun 对不起,我们是 solr 世界的新手。我在solr方面没有太多经验。 :(

标签: php solr solarium


【解决方案1】:

这是一种重新设计架构的可能方法。希望这能给你一些想法。

我将假设您所有产品的每数量价格都是以下 50 的倍数。否则,您将需要减少间隔。

像这样定义一个名为 price_upto_*dynamic field

<dynamicField name="price_upto_*" type="integer" indexed="true" stored="true"/>

然后您可以使用以下字段为您的文档编制索引:

price_upto_50: 1,
price_upto_100: 2,
price_upto_150: 3,
price_upto_200: 4

以下是为查询编写客户端代码的方法。下面使用整数除法(意思是(20/50)=0,(60/50)=1等,)

查询:如果我搜索数量 20,那么应该会显示以上结果。

在您的客户端中,您需要计算:50 * (1 + (20/50)) = 50 * (1 + 0) = 50。所以您要搜索的字段是price_upto_50。您的查询将类似于q=price_upto_50:[* TO *]

查询:如果我搜索价格 1,则应该显示以上结果。

q=price_upto_50:1 OR price_upto_100:1 OR price_upto_150:1 OR price_upto_200:1

如您所见,如果您有每个 50 间隔的价格,这可能会变得很难看。因此,您可以使用建议的复制字段 here 并将所有价格字段复制到该字段并发出如下搜索:

q=price_upto_static:1

查询:如果我搜索价格 3 和数量 60 则不应显示上述结果。

q=price_upto_100:3

(您的文档不匹配。)

【讨论】:

  • 您好 arun 非常感谢您帮助我解决 solr 架构构建问题。但是我的产品范围对于任何产品都不是固定的,但是您的回答让我很好地理解了架构。这个答案可能对某些人有所帮助,所以我接受了这个答案。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多