【问题标题】:SOLR faceted-search to return facet counts as with OR operatorSOLR 分面搜索返回分面计数,与 OR 运算符一样
【发布时间】:2013-05-12 09:07:48
【问题描述】:

在设置问题之前,我将首先尝试解释我想通过在 SOLR 中使用分面搜索来实现什么。想象一下,我有一个狗的参数,它描述了狗适合什么,一只狗可以有多种选择。我们称之为“住房”。所以狗适合:

  1. 室内
  2. 户外
  3. 孩子们
  4. 老人
  5. 守卫。

所以基本上当我在这个参数上使用分面搜索时,我会用我当前的数据库得到这样的结果(url 查询facet=true&facet.field=housing):

室内(74),户外(63),儿童(71),老人(65),看守(31)。

现在当我检查户内参数(url 查询fq=housing:1&facet=true&facet.field=housing)时,我得到如下结果:

室内(74),户外(53),儿童(60),老人(53),看守(15)。

它告诉我,如果检查下一个参数“户外”,则有 53 只狗在室内和室外。我想得到结果,它会告诉“如果我检查下一个选项,将有多少只狗被添加到结果中”。因为可能有只适合户外活动的狗。我想在检查第一个“室内”参数后得到这样的结果:
室内 (74), 户外(83), 儿童(78), 老人(79), 守卫(75)
或者以其他方式
室内(+0),户外(+9),儿童(+4),老人(+5),守卫(+1)

在 SOLR 分面搜索中是否可能出现这种情况?还是我使用了不正确的工具来实现这一点。因为基本上当我检查“室内”和“室外”时,我会从查询中得到正确的结果计数(url 查询fq=housing:(1 OR 2)&facet=true&facet.field=housing)。只是方面计数不是我所期望的。

【问题讨论】:

  • 没有复杂的例子?你想获得与过滤器无关的方面计数吗???
  • 我已经弄清楚,实现我想要的唯一方法(可能)是针对 fq=housing:(!(1))&facet=true&facet.field=housing&rows 这样的方面进行另一个查询=0 这基本上否定了原始查询。对于更多检查选项(例如室内和室外),我需要像 fq=housing:(!(1 OR 2))&facet=true&facet.field=housing&rows=0 这样的查询。由于有更多的参数,我基本上需要每个参数进行这个“否定”查询来获取数字,这对我来说似乎并不是最优的:/
  • 您可以在同一查询中排除构面过滤器。 wiki.apache.org/solr/…。您还可以为构面字段添加别名,以便同时获得包含和排除的构面

标签: solr faceted-search facet


【解决方案1】:

附加参数 &rows=0

【讨论】:

  • 虽然这不是上述问题的答案,但这将帮助您减少查询获取初始方面结果(用于构建初始过滤器)所花费的时间,而不会丢失太多表现。 (因为过滤器查询结果将被缓存)+1 给我一个好主意!
【解决方案2】:

我认为下一个方法应该可行:

fq={!tag=housing}housing:1&facet.field={!key=housing}housing&facet.field={!key=housing_ex ex=housing}housing

你应该得到类似的东西:

"facet_counts": {
  "facet_queries": {},
  "facet_fields": {
    "housing": [
      "1", 74,
      "2", 53,
      "3", 60,
      "4", 53,
      "5", 15
    ],
    "housing_ex": [
      "1", 74,
      "2", 63,
      "3", 71,
      "4", 65,
      "5", 31
    ]
  }
}

那么你应该这样做:housing_ex - housing。结果是:

1: +0
2: +10
3: +11
4: +12
5: +16

numFound + housing_ex - housing:

1: 74
2: 84
3: 85
4: 86
5: 90

facet.query 不适合很多构面值。

【讨论】:

    【解决方案3】:

    我认为您需要使用facet.query 参数,这将允许您指定一个仅适用于分面结果而非主查询的查询。

    此参数允许您在 Lucene 默认语法中指定任意查询以生成构面计数。默认情况下,faceting 返回“字段”的唯一术语的计数,而 facet.query 允许您确定任意术语或表达式的计数。

    在您的情况下,我相信您仍会返回“字段”的唯一术语的方面计数,但应用了一些额外的过滤器。

    【讨论】:

    • 哇,这是一个答案。是的,我现在能够以我需要的方式准确地返回构面计数。我还需要提到我使用 Jayendra 的方式在同一查询中排除构面过滤器,最终查询如下所示: fq={!tag=dt}housing(1 OR 2)&facet=true&facet.query={!ex=dt住房:(3且!(1或2))所以当检查选项“室内”和“oudoors”时,如果检查第三个,我需要知道将返回多少结果。 span>
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2022-01-07
    • 1970-01-01
    • 2012-06-15
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多