小平面问题

Der*_*mel 6 elasticsearch

我正在尝试使用ElasticSearch进行分析 - 专门用于跟踪手动滚动的Rails CMS的"顶级内容".这个要求比为每个内容保留一个计数器要复杂得多.我现在不会深入研究问题的深度,因为我似乎无法完成基本工作.

我的问题是这样的:我正在使用方面而且计数并不是我所期望的.例如:

查询:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":1,"all_terms":false,"order":"count"}}}}
Run Code Online (Sandbox Code Playgroud)

结果:

{"el_ids":{"_type":"terms","missing":0,"total":16672,"other":16657,"terms":[{"term":"quis","count":15}]}}
Run Code Online (Sandbox Code Playgroud)

好吧,伟大的,这块的ID为内容的"QUIS"有15支安打,自orderIS count,它应该是我的前一段内容.现在让我们获取前5个内容.

查询:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":5,"all_terms":false,"order":"count"}}}}
Run Code Online (Sandbox Code Playgroud)

结果(只是方面):

[
  {"term":"qgz9","count":26},
  {"term":"quis","count":15},
  {"term":"hnqn","count":15},
  {"term":"higp","count":15},
  {"term":"csns","count":15}
]
Run Code Online (Sandbox Code Playgroud)

咦?所以内容w/id"qgz9"的内容有26个更多?为什么它不是第一个查询的最高结果?

好吧,让我们现在获得前100名.

查询:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":100,"all_terms":false,"order":"count"}}}}
Run Code Online (Sandbox Code Playgroud)

结果(只是方面):

[
  {"term":"qgz9","count":43},
  {"term":"difc","count":37},
  {"term":"zryp","count":31},
  {"term":"u65r","count":31},
  {"term":"sxsi","count":31},
  ...
]
Run Code Online (Sandbox Code Playgroud)

所以现在"qgz9"有43次点击而不是26次?怎么可能?我可以向你保证,在后台修改索引时没有任何事情发生.如果我重复这些查询,我会得到相同的结果.

当我重复这个增加结果大小的过程时,计数会继续变化,并且新的内容ID会出现在顶部.有人可以向我解释我做错了什么,或者我对其工作原理的理解有缺陷吗?

Der*_*mel 7

事实证明,这是一个已知问题:

...前N个方面现在的工作方式是从每个分片中获取前N个,并合并结果.这可能会产生不准确的结果.

默认情况下,我的索引是使用5个分片创建的.通过更改此值,索引只有一个分片,计数符合我的预期.另一种解决方法是始终将size值设置为大于预期方面的数量,并剥离前N个结果.