在弹性搜索中默认禁用字段分析

时间:2014-12-19 16:47:09

标签: elasticsearch

是否可以为类型选择性地启用弹性搜索字段的索引?

通过特定索引的映射设置,可以设置属性

{“index”:“not_analyzed”}

针对特定领域。由于我的文档包含太多字段,并且将来可能会更改结构,因此我需要一个映射,默认情况下不对字段进行分析,除非另有说明。

这可能吗?

3 个答案:

答案 0 :(得分:32)

是的 - 看看dynamic templates

尝试以下方法:

PUT /my_index
{
  "mappings": {
    "my_type": {
        "dynamic_templates": [
            { "notanalyzed": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":        "string",
                      "index":       "not_analyzed"
                  }
               }
            }
          ]
       }
   }
}

动态模板适用于您的地图未涵盖的新字段 - 来自文档:

  

使用dynamic_templates,您可以完全控制映射   为新检测到的字段生成的。

您还可以根据字段名称更改映射,例如使用"match": "*_data",为以" _data"结尾的字段名称设置不同的映射集。

答案 1 :(得分:2)

从elasticsearch 5.x string 类型被禁用。相反,elasticsearch引入了两种类型 text keyword 。阅读此博客,了解迁移数据的原因https://www.elastic.co/blog/strings-are-dead-long-live-strings

因此,您可以简单地使用field.keyword进行精确搜索,而不是添加模板来禁用分析器。 例如如果字段名称为fullName,并且您有条目

  1. fullName:" John Doe"
  2. 全名:"约翰"
  3. 然后,fullName:" John"将返回两个结果,而fullName.keyword:" John"将返回单个记录。

    以防万一,你仍然想要禁用文本字段,你可以使用下面的动态模板,

    PUT _template/disable_all_analyzer
       {
         "template": "*",
         "mappings": {
           "_default_": {
               "dynamic_templates": [
                   { "notanalyzed": {
                         "match":              "*", 
                         "match_mapping_type": "string",
                         "mapping": {
                             "type":        "keyword"
                         }
                      }
                   }
                 ]
              }
          }
       }
    

    干杯!!!

答案 2 :(得分:0)

Ashay代码可以正常工作,但是由于它不包含索引指令,因此文档将被存储但未被索引,因此您将无法进行搜索或汇总。

我建议以另一种方式添加它:

PUT _template/disable_all_analyzer
   {
     "template": "*",
     "mappings": {
       "_default_": {
           "dynamic_templates": [
               { "notanalyzed": {
                     "match":              "*", 
                     "match_mapping_type": "string",
                     "mapping": {
                         "type":        "keyword",
                         "index":    "not_analyzed"
                     }
                  }
               }
             ]
          }
      }
   }