根据 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"
          }
        }
      ]
    }
  }
}