2

我的 Elasticserch 索引 索引名称 = 电影

{
   "title": "Chris ENDGAME",
   "cast": [
      {
         "firstName": "Chris",
         "lastName": "Evans"
      },
      {
         "firstName": "Chris",
         "lastName": "Hemsworth"
      },
      {
         "firstName": "Chris",
         "lastName": "Prat"
      }
   ]
} 

同样, 我还有 3 个电影文档

电影2:冬日战士

主演:克里斯·埃文斯 斯嘉丽·约翰逊

Movies3:蚁人

主演:保罗·路德迈克尔·佩纳

电影4:复仇者联盟

主演:克里斯·埃文斯 克里斯·海姆斯沃斯

有了这个,现在我有 4 部电影: 1. Endgame;2.冬兵;3.蚁人;4.复仇者联盟

现在,我想创建一个 elasticsearch7 搜索查询,如果我按搜索到的每个索引的匹配数顺序搜索Chris'(总体:标题和名字)。

即, OUTPUT(ordered) = Movies1,Movies4,Movies2,因为 movie1 有 4 , Movies4 有 2 并且 Movies2 有 1 chris 匹配名字

到目前为止,我已经能够编写一个基本查询,但我不知道如何订购文档

我的搜索查询

{
  "query": {
    "bool": {
      "must": [
        { "multi_match": { "query": "Chris" }}
      ]
    }
  }
}

我该如何订购?

4

1 回答 1

1

首先,您还应该提供字段“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"嵌套字段中的每个子匹配添加分数

编辑

如果您想同时搜索标题和嵌套子项,则必须使用bool Query组合,因此您的查询将如下所示:

POST test_movies/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "Chris"
          }
        },
        {
          "nested": {
            "path": "cast",
            "query": {
              "match": {
                "cast.firstName": "Chris"
              }
            },
            "score_mode": "sum"
          }
        }
      ]
    }
  }
}
于 2020-04-01T11:14:31.643 回答