覆盖弹性搜索的默认关键字分析

Overriding default keyword analysis for elasticsearch

我正在尝试将 elasticsearch 索引配置为具有使用 keyword 分析器进行分析的默认索引策略,然后在某些字段上覆盖它,以允许对它们进行自由文本分析。如此有效地选择自由文本分析,我在映射中明确指定分析哪些字段以进行自由文本匹配。我的映射定义如下所示:

PUT test_index
{
   "mappings":{
      "test_type":{
         "index_analyzer":"keyword",
         "search_analyzer":"standard",
         "properties":{
            "standard":{
               "type":"string",
               "index_analyzer":"standard"
            },
            "keyword":{
               "type":"string"
            }
         }
      }
   }
}

所以standard应该是一个分析字段,keyword应该只是完全匹配。但是,当我使用以下命令插入一些示例数据时:

POST test_index/test_type
{
  "standard":"a dog in a rug",
  "keyword":"sheepdog"
}

我没有得到与以下查询的任何匹配项:

GET test_index/test_type/_search?q=dog

但是我匹配:

GET test_index/test_type/_search?q=*dog*

这让我觉得 standard 字段没有被分析。有谁知道我做错了什么?

创建的索引没有问题。将您的查询更改为 GET test_index/test_type/_search?q=standard:dog,它应该 return 预期结果。

如果您不想在查询中指定字段名称,请更新您的映射,以便为每个没有默认值的字段明确提供 index_analyzersearch_analyzer 值。见下文:

PUT test_index
{
   "mappings": {
      "test_type": {
         "properties": {
            "standard": {
               "type": "string",
               "index_analyzer": "standard",
               "search_analyzer": "standard"
            },
            "keyword": {
               "type": "string",
               "index_analyzer": "keyword",
               "search_analyzer": "standard"
            }
         }
      }
   }
}

现在,如果您尝试 GET test_index/test_type/_search?q=dog,您会得到想要的结果。