如果使用,弹性搜索词查询将不起作用 field.keyword

Elastic search term query not working if used field.keyword

我有下面的弹性搜索映射

{
   "2021-05-ui":{
      "mappings":{
         "userinfo":{
            "properties":{
               "address":{
                  "type":"text",
                  "fields":{
                     "keyword":{
                        "type":"keyword",
                        "ignore_above":256
                     }
                  }
               },
               "name":{
               "type":"keyword"
            },
            "userId":{
               "type":"keyword"
            }
         }
      }
   }
}

我想在 userId 字段上使用术语查询,如下所示,它不起作用,但是当我从下面的查询中删除 .keyword 时,我希望查询与 userId 字段的精确值匹配

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "userId.keyword": "test@user.com"
                    }
                }
            ]
        }
    }
}

我只希望使用 "userId.keyword" 进行查询,因为其他环境同时具有文本和关键字映射,您能否建议我们可以使用哪个查询来获得精确匹配,我尝试使用匹配,match_phrase 但没有太大帮助。

userId字段为keyword类型,即使用关键字分析器,而不是标准分析器。在这种情况下,您只会获得完全匹配的结果

由于userId属于keyword类型,userId.keyword没有字段,所以必须使用userId进行term查询

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "userId": "test@user.com"
                    }
                }
            ]
        }
    }
}

但是如果你想存储 userId 字段作为 textkeyword 类型,那么你可以 update your index mapping as shown below to use multi fields

PUT /_mapping
{
  "properties": {
    "userId": {
      "type": "keyword",
      "fields": {
        "raw": {
          "type": "text"
        }
      }
    }
  }
}

然后重新索引数据。在此之后,您将能够使用 keyword 类型的 "userId" 字段和 text 类型

"userId.raw" 字段进行查询