Elasticsearch 排序依据:元素在数组中的存在和日期

Elasticsearch Sort by: element presence in the array and date

我想在 v5.6 上构建一个查询,我可以在其中找到以下所有书籍:

{
  title: "book1"
  users_favourite: ["1", "2"],
  userid: "1",
  date: timestamp
}

我有大部分查询,但我不知道如何将最喜欢的书放在最上面并按日期排序:

{
  "from" : 0,
  "size" : 51,
  "query" : {
    "bool" : {
      "should" : [
        {
          "match" : {
            "users_favourite" : {
              "query" : "1",
              "operator" : "OR"
            }
          }
        },
        {
          "term" : {
            "userid" : {
              "value" : "1"
            }
          }
        }
      ]
    }
  },
  "sort" : [
    {
      "date" : {
        "order" : "desc",
        "missing" : "_last",
        "unmapped_type" : "string"
      }
    }
  ]
}

所以输出将是:所有用户最喜欢的书在前,按日期排序 其次是该用户拥有的书籍也按日期排序。

user's favourite date
true 2021
true 2020
true 2018
false 2021
false 2019
false 2017

我会使用的一般解决方案是这样的

关于排序:

GET social_unique_flat_verified_guesses/_search
{
  "from": 0,
  "size": 51,
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "users_favourite": {
              "query": "1",
              "operator": "OR"
            }
          }
        },
        {
          "term": {
            "userid": {
              "value": "1"
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "lang": "painless",
          "source": "doc['users_favourite'].contains(params.users_favourite) ? 1 : 0",
          "params": {
            "users_favourite": "1"
          }
        },
        "order": "desc"
      }
    },
    {
      "date": {
        "order": "desc",
        "missing": "_last",
        "unmapped_type": "string"
      }
    }
  ]
}

如果这本书是用户最喜欢的,这会告诉 elastic 首先对所有匹配的(1 或 0)评分,然后按年份评分。

此外,我会将用户喜爱的 should 子句更改为此

"term": {
      "users_favourite": {
        "value": "1"
      }
    }

请记住,如果“users_favourite”字段可以为空,或者如果查询可以搜索多个用户收藏夹,则查询需要有所不同。所以让我知道,我会编辑它