我正在使用弹性搜索,我想根据所有文档中存储的“喜欢”字段整数类型的较高数量,对与下面所示的查询具有相同分数的文档进行排序。代码 -
query: {
multi_match: {
query: "some cooler",
type: "most_fields",
fields: ["info1", "info2", "info3"]
}
}
您应该检查排序文档
只需在 json 上添加一个排序部分,按分数排序,后跟您的自定义字段。
{
"query" : {...},
"sort" : [
"_score",
{ "likes" : {"order" : "desc"}}
]
}
默认情况下,分数顺序为“desc”。其他字段默认为“asc”,因此如果您想要的话,您需要为“likes”字段定义“desc”顺序。
您可以简单地在排序条件中使用
_score
,如下所示:
{
...
"sort": [
"_score",
"another_field"
]
}
这将按分数降序对所有文档进行排序,对于那些分数完全相同的文档,它们将按
another_field
排序作为决胜局。默认情况下,another_field
将按升序排序,但这可以自定义(阅读文档了解更多详细信息)。
请注意,ElasticSearch 不保证一致的评分,因此当您想使用字段作为分数的决胜局时,这可能会出现问题,特别是当您使用
should
进行布尔查询时。
您可能期望以完全相同的方式匹配
should
标准的文档具有相同的分数。但是,如果索引有多个分片,则分数可能不完全相同(更多信息此处)。仅按分数排序时,这通常不是问题,因为分数应该相似,但如果您使用决胜局,则决胜局字段将仅在一个分片的文档中起作用,换句话说,在以下文档中起作用:以同样的方式匹配条件可能不会按您的决胜局排序,而是先按分片排序,然后按决胜局字段排序。
如果您真的关心决胜局字段的顺序,这可能是一个问题。为了避免此问题,您可能需要使用
dfs_query_then_fetch
搜索类型。更详细的解释这里.