Elastic Search 使用另一个字段值对具有相同分数的文档进行排序

问题描述 投票:0回答:2

我正在使用弹性搜索,我想根据所有文档中存储的“喜欢”字段整数类型的较高数量,对与下面所示的查询具有相同分数的文档进行排序。代码 -

query: {
                multi_match: {
                        query: "some cooler",
                        type: "most_fields",
                        fields: ["info1", "info2", "info3"]
                }
        }
sorting elasticsearch
2个回答
10
投票

您应该检查排序文档

只需在 json 上添加一个排序部分,按分数排序,后跟您的自定义字段。

{
    "query" : {...},
    "sort" : [
        "_score",
        { "likes" : {"order" : "desc"}}
    ]
}

默认情况下,分数顺序为“desc”。其他字段默认为“asc”,因此如果您想要的话,您需要为“likes”字段定义“desc”顺序。


0
投票

您可以简单地在排序条件中使用

_score
,如下所示:

{
  ...
  "sort": [
    "_score",
    "another_field"
  ]
}

这将按分数降序对所有文档进行排序,对于那些分数完全相同的文档,它们将按

another_field
排序作为决胜局。默认情况下,
another_field
将按升序排序,但这可以自定义(阅读文档了解更多详细信息)。

评分一致性

请注意,ElasticSearch 不保证一致的评分,因此当您想使用字段作为分数的决胜局时,这可能会出现问题,特别是当您使用

should
进行布尔查询时。

您可能期望以完全相同的方式匹配

should
标准的文档具有相同的分数。但是,如果索引有多个分片,则分数可能不完全相同(更多信息此处)。仅按分数排序时,这通常不是问题,因为分数应该相似,但如果您使用决胜局,则决胜局字段将仅在一个分片的文档中起作用,换句话说,在以下文档中起作用:以同样的方式匹配条件可能不会按您的决胜局排序,而是先按分片排序,然后按决胜局字段排序。

如果您真的关心决胜局字段的顺序,这可能是一个问题。为了避免此问题,您可能需要使用

dfs_query_then_fetch
搜索类型。更详细的解释这里.

© www.soinside.com 2019 - 2024. All rights reserved.