Elasticsearch 排序依据:元素在数组中的存在和日期
Elasticsearch Sort by: element presence in the array and date
我想在 v5.6 上构建一个查询,我可以在其中找到以下所有书籍:
- 属于某个用户或被该用户标记为收藏夹
- 然后根据他们是他的 最喜欢的第一个 和日期 desc 的事实对它们进行排序。
图书记录看起来像这样
{
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”字段可以为空,或者如果查询可以搜索多个用户收藏夹,则查询需要有所不同。所以让我知道,我会编辑它
我想在 v5.6 上构建一个查询,我可以在其中找到以下所有书籍:
- 属于某个用户或被该用户标记为收藏夹
- 然后根据他们是他的 最喜欢的第一个 和日期 desc 的事实对它们进行排序。 图书记录看起来像这样
{
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”字段可以为空,或者如果查询可以搜索多个用户收藏夹,则查询需要有所不同。所以让我知道,我会编辑它