【问题标题】:search results and facet results do not match搜索结果和构面结果不匹配
【发布时间】:2014-01-10 14:44:01
【问题描述】:

我正在 phrase_prefix 搜索“工程师”,我在“技能”字段方面获得了 36 个术语“工程”。接下来,我在该构面字段上为“工程”应用term filter,现在在新的过滤结果中,构面中“工程”的计数为 42。

过滤后的查询返回 42 个结果,每个结果都匹配 facet,也就是说,它们都包含“Engineering”作为技能。

因此,我希望未过滤的查询在“技能”方面的“工程”术语有 42 个计数,但正如我上面提到的,它只有 36 个。

这里是映射和查询 https://gist.github.com/santiago/a249418e5bf7531ead85

我在这里缺少什么?

谢谢

PD。我正在使用 0.90.5

【问题讨论】:

  • 试试这个要点:gist.github.com/eire1130/44d18734503267c835b9 运行两次,一次使用过滤器位,一次不使用。
  • 同样的结果。没有过滤器我看到 36 个工程计数,而添加过滤器显示 42。
  • 这里有一些东西可以更好地说明这种情况:gist.github.com/santiago/ee65c9da0c6a5270dee0 查询返回 6 个结果,看看这 6 个技能中的每一个都存在“Microsoft Word”、“Microsoft Office”和“English”。但请查看这些术语在方面的计数。 “Microsoft Word”(5)、“Microsoft Office”(5)和“English”(3)
  • 如果将 size=50 增加到像 size=500 这样更大的值会怎样?

标签: filter elasticsearch facets


【解决方案1】:

在 0.90.5 中,您可以通过增加构面列表的大小来获得您期望的结果:

  "facets": {
    "skills": {
      "terms": {
        "field": "skills",
        "size": 50
      }
    },

Elasticsearch docs on term facets 中解释了您得到不准确结果的原因以及增加大小有帮助的原因:

size 参数定义了应该返回多少个 top term 的总条款列表。默认情况下,协调节点 搜索过程将要求每个分片提供自己的最大尺寸术语 并且一旦所有分片都响应,它会将结果减少到最终 然后将发送回客户端的列表。这意味着,如果 唯一项的数量大于大小,返回的列表是 稍微偏离且不准确(可能是术语计数是 稍微偏离,甚至可能是一个应该在 未返回最大尺寸条目)。

在 0.9.6+ 中,您可以将 shard_size 参数添加到 facet,告诉它从每个分片请求多少个术语,然后将结果合并到一个列表中。

【讨论】: