【问题标题】:merge multiple solr facceted search into one将多个 solr 分面搜索合并为一个
【发布时间】:2011-06-17 11:28:38
【问题描述】:

我有一系列产品。对于每个产品,我必须创建一个 solr 分面搜索。

以下“产品”的示例:

Computer
TV
MP3-Player

通过使用分面搜索,我想确定每种产品在 PRODUCT 字段中出现的频率。 结果如下

Comupter (3)
  -apple
  -ibm
  -dell
TV (5)
  -sony
  -toshiba
  [...]
MP3-player (10)
  -[...]

现在,我意识到通过对每个单词/产品使用一个多面搜索。 这可行,但使用以下选项会在 400 毫秒内返回结果:

'facet' => 'true'
'facet.field' => 'PRODUCT'
'facet.method' => 'enum'
 'facet.limit'=>200
'facet.mincount'=>4
 'fq' => 'PRODUCT:computer'    <- by iterating an array with PHP i change the product (computer,tv,...) on every iteration

不幸的是,在现实生活中没有 3 个产品(如上面的示例),大约有 100 个相关的产品。这意味着:PHP 脚本必须请求 100 次 solr 搜索,时间为 400 毫秒 - 所以脚本运行 40 秒,这太长了。 我无法对“所有”产品(没有“fq =”)进行无限制/无限制的多面搜索,因为有成千上万的产品,我不需要每个产品的信息。

有没有办法实现更好的性能,例如将多个 solr 请求合并为一个?

谢谢!

【问题讨论】:

  • 我怀疑你会得到"TV"的结果

标签: php lucene solr facet faceted-search


【解决方案1】:

我不太明白,但您不能只为与查询相关的产品创建一个过滤查询吗:

facet' => 'true'
'facet.field' => 'PRODUCT'
'facet.method' => 'enum'
'facet.limit'=>200
'facet.mincount'=>4
'fq' => 'PRODUCT:(computer OR tv OR mp3-player)'

然后对返回的结果做一些处理?

【讨论】:

  • 抱歉,我的问题不够明确。所以我更新了上面的例子。如您所见,我对频率以及产品的制造商感兴趣。通过运行您的示例,我一次获得了所有制造商,而没有属于特定产品的信息。
  • 您控制架构吗?你可以添加字段吗?一种方法是存储连接信息,例如 Computer/Ibm 等(严格来说是分类法),然后在客户端中对其进行解码
【解决方案2】:

您通常不想在分面时过滤特定类型的值。分面背后的想法是,它将对分面字段中的所有值(对于与原始查询匹配的所有项目)进行“分组”和“计数”。

如果您只是删除 fq 参数,您将看到作为回报,您将获得 PRODUCT 字段中至少出现 4 次的所有值的列表以及每个值的计数。

【讨论】:

  • 抱歉,我的问题不够准确。请查看示例的更新。
  • 我要做的是在客户端缓存分类并为产品创建一个方面,获取电视、计算机等的计数,然后在客户端生成列表(形成缓存的分类) .这是因为您对第二级的计数不感兴趣。如果您是,我建议您使用 Karls 的建议并为分类编制索引,并在客户端中针对每个请求对其进行解析。
猜你喜欢
  • 2020-08-15
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 2022-12-03
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多