我正在尝试使用ElasticSearch进行分析 - 专门用于跟踪手动滚动的Rails CMS的“顶级内容”。这个要求比为每个内容保留一个计数器要复杂得多。我现在不会深入研究问题的深度,因为我似乎无法使基础知识发挥作用。
我的问题是这样的:我正在使用方面而且计数并不是我所期望的。例如:
查询:
{"facets":{"el_ids":{"terms":{"field":"el_id","size":1,"all_terms":false,"order":"count"}}}}
结果:
{"el_ids":{"_type":"terms","missing":0,"total":16672,"other":16657,"terms":[{"term":"quis","count":15}]}}
好的,很棒,ID为“quis”的内容有15次点击,而且order
是count
,它应该是我最重要的内容。现在让我们获取前5个内容。
查询:
{"facets":{"el_ids":{"terms":{"field":"el_id","size":5,"all_terms":false,"order":"count"}}}}
结果(只是方面):
[
{"term":"qgz9","count":26},
{"term":"quis","count":15},
{"term":"hnqn","count":15},
{"term":"higp","count":15},
{"term":"csns","count":15}
]
咦?所以内容w / id“qgz9”的内容有26个更多?为什么不是第一个查询的最高结果?
好的,我们现在就获得前100名。
查询:
{"facets":{"el_ids":{"terms":{"field":"el_id","size":100,"all_terms":false,"order":"count"}}}}
结果(只是方面):
[
{"term":"qgz9","count":43},
{"term":"difc","count":37},
{"term":"zryp","count":31},
{"term":"u65r","count":31},
{"term":"sxsi","count":31},
...
]
所以现在“qgz9”有43次点击而不是26次点击?怎么可能?我可以向你保证,在后台修改索引时没有任何事情发生。如果我重复这些查询,我会得到相同的结果。
当我重复这个增加结果大小的过程时,计数会继续变化,并且新的内容ID会出现在顶部。有人可以向我解释我做错了什么,或者我对其工作原理的理解是有缺陷的吗?
答案 0 :(得分:7)
事实证明这是known issue:
...前N个方面现在的工作方式是从每个分片中获取前N个,然后合并结果。这可能会产生不准确的结果。
默认情况下,我的索引是使用5个分片创建的。通过更改此值,索引只有一个分片,计数符合我的预期。另一种解决方法是始终将size
设置为大于预期方面数的值,并剥离前N个结果。