根据 ElasticSearch 中的嵌套 child 计数对文档进行排序
Sort Documents based on nested child count in ElasticSearch
我的 Elasticserch 索引
索引名称 = 电影
{
"title": "Chris ENDGAME",
"cast": [
{
"firstName": "Chris",
"lastName": "Evans"
},
{
"firstName": "Chris",
"lastName": "Hemsworth"
},
{
"firstName": "Chris",
"lastName": "Prat"
}
]
}
同理,
我还有3个电影文件
电影2:冬兵
演员:克里斯·埃文斯、斯嘉丽·约翰逊
电影3:Ant-Man
演员:保罗·路德、迈克尔·佩纳
电影4:复仇者联盟
演员:克里斯·埃文斯、克里斯·海姆斯沃斯
有了这个,我现在有 4 部电影: 1. Endgame; 2.Winter士兵; 3.Ant-Man; 4.Avengers
现在, 我想创建一个 elasticsearch7 搜索查询,如果我搜索 Chris'(总体:标题和名字)按照搜索到的每个索引的匹配项数排序。
即 OUTPUT(ordered) = Movies1,Movies4,Movies2,因为 movie1 有 4 个,Movies4 有 2 个,Movies2 有 1 个 chris 匹配名字
到现在为止,我已经能够编写一个基本的查询,但我不知道如何订购文档
我的搜索查询
{
"query": {
"bool": {
"must": [
{ "multi_match": { "query": "Chris" }}
]
}
}
}
如何订购?
首先,您还应该提供字段的嵌套映射 "cast":
PUT test_movies
{
"mappings": {
"properties": {
"cast": {
"type": "nested",
"properties": {
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
请注意,这是默认的弹性映射,每个字段都有关键字和文本,但最佳做法是指定每个字段是关键字、文本还是两者。此外,为了更改您的索引映射,您必须删除并重新创建它
现在您的字段 "cast" 已声明为嵌套,您可以对其进行嵌套查询:
POST test_movies/_search
{
"query": {
"nested": {
"path": "cast",
"query": {
"match": {
"cast.firstName": "Chris"
}
},
"score_mode": "sum"
}
}
}
"score_mode": "sum"
将在您的嵌套字段
上添加每个 sub-match 的分数
编辑
如果您想同时搜索标题和嵌套 child,您必须使用 bool Query 组合,因此您的查询将像这样:
POST test_movies/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "Chris"
}
},
{
"nested": {
"path": "cast",
"query": {
"match": {
"cast.firstName": "Chris"
}
},
"score_mode": "sum"
}
}
]
}
}
}
我的 Elasticserch 索引 索引名称 = 电影
{
"title": "Chris ENDGAME",
"cast": [
{
"firstName": "Chris",
"lastName": "Evans"
},
{
"firstName": "Chris",
"lastName": "Hemsworth"
},
{
"firstName": "Chris",
"lastName": "Prat"
}
]
}
同理, 我还有3个电影文件
电影2:冬兵
演员:克里斯·埃文斯、斯嘉丽·约翰逊
电影3:Ant-Man
演员:保罗·路德、迈克尔·佩纳
电影4:复仇者联盟
演员:克里斯·埃文斯、克里斯·海姆斯沃斯
有了这个,我现在有 4 部电影: 1. Endgame; 2.Winter士兵; 3.Ant-Man; 4.Avengers
现在, 我想创建一个 elasticsearch7 搜索查询,如果我搜索 Chris'(总体:标题和名字)按照搜索到的每个索引的匹配项数排序。
即 OUTPUT(ordered) = Movies1,Movies4,Movies2,因为 movie1 有 4 个,Movies4 有 2 个,Movies2 有 1 个 chris 匹配名字
到现在为止,我已经能够编写一个基本的查询,但我不知道如何订购文档
我的搜索查询
{
"query": {
"bool": {
"must": [
{ "multi_match": { "query": "Chris" }}
]
}
}
}
如何订购?
首先,您还应该提供字段的嵌套映射 "cast":
PUT test_movies
{
"mappings": {
"properties": {
"cast": {
"type": "nested",
"properties": {
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
请注意,这是默认的弹性映射,每个字段都有关键字和文本,但最佳做法是指定每个字段是关键字、文本还是两者。此外,为了更改您的索引映射,您必须删除并重新创建它
现在您的字段 "cast" 已声明为嵌套,您可以对其进行嵌套查询:
POST test_movies/_search
{
"query": {
"nested": {
"path": "cast",
"query": {
"match": {
"cast.firstName": "Chris"
}
},
"score_mode": "sum"
}
}
}
"score_mode": "sum"
将在您的嵌套字段
编辑
如果您想同时搜索标题和嵌套 child,您必须使用 bool Query 组合,因此您的查询将像这样:
POST test_movies/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "Chris"
}
},
{
"nested": {
"path": "cast",
"query": {
"match": {
"cast.firstName": "Chris"
}
},
"score_mode": "sum"
}
}
]
}
}
}