Elasticsearch::排序给出奇怪的结果

Elasticsearch:: Sorting giving weird results

当我第一次搜索时,它对所有文档进行排序并为我提供前 5 条记录。但是,如果通过更改排序方向(ASC -> DESC)执行相同的搜索查询,则它不会再次对所有文档进行排序,它会给我最后 5 个检索到的文档(来自先前的搜索查询),按降序排列它们,然后给出它还给我。我原以为它会按 DESC 顺序对所有可用文档进行排序,然后检索前 5 个结果。

我是不是做错了什么,或者漏掉了什么概念。

我的搜索查询:

{
    "sort": {
        "taskid": {
            "order": "ASC"
        }
    },
    "from": 0,
    "size": 5,
    "query": {
        "filtered": {
            "query": {
                "match_all": []
            }
        }
    }
}

我有 taskid 1 到 100 的数据。现在上面的查询在第一次尝试时从 taskid 1 到 5 获取了我的记录。现在,当我将排序方向更改为 desc 时,我期望应该返回 taskid 96-100(100,99,98,97,96 序列)的文档,但是我返回的是 taskid 5,4,3,2 的文档, 1 在那个序列中。也就是说,只对之前返回的结果进行了排序。

请注意,taskid 和 _id 在我的文档中是相同的。我在映射中添加了一个与 _id

相同的冗余字段

只需更改 order 键值的大小写即可。

{
"sort": {
    "taskid": {
        "order": "asc"   // or "desc"
    }
},
"from": 0,
"size": 5,
"query": {
    "filtered": {
        "query": {
            "match_all": []
        }
    }
  }
}

希望这对您有所帮助..

在elasticsearch中,排序查询是在es中提取结果后进行的。根据您问题中提到的查询,第一个结果根据搜索条件进行过滤,然后对过滤后的结果应用排序。

如果看起来您只是根据数据的旧子集获得结果,则可能是您的新数据尚未编入索引。这在自动化测试中很容易发生,但在手动测试中不太可能发生。

片段每秒都会重建,因此如果这是问题所在,在索引和搜索之间添加大约一秒的 delay/sleep 应该可以解决您的测试。