ElasticSearch的映射详细

字段设置参数

  • “type”: “text”, // 指定字段的数据类型
  • “analyzer”:”ik _max_word”, //指定分词器的名称,即可用使用内置的分词器也可以使用第三方分词器 
    • 默认standard,
    • 内置的分析器有whitespace 、 simple和english
    • 第三方分词器:ik分词器 包括ik_max_word和ik_smart,ik_max_word:会将文本做最细粒度的拆分;尽可能多的拆分出词语 ,ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
  • “search_analyzer”:”ik _max_word” // 指定查询的分词器,默认和analyzer保持一致,一般分词器和查询分词器要保持一致
  • “properties”: {}, // 当数据类型是object时,需要具体指定内部对象对应的字段
  • “format”: “yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis” // 格式化,一般用于指定日期类型的格式
  • “dynamic”: “strict” 动态映射配置,当文档中发现新字段时应该如何处理, 可以用在根 object 或任何 object 类型的字段上,你可以将 dynamic 的默认值设置为 strict , 而只在指定的内部对象中开启它 
    • true: 默认值,动态添加新的字段
    • false: 忽略新的字段
    • strict: 如果遇到新字段抛出异常,如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。
  • dynamic_templates 动态模板:为满足条件的字段做统一映射,可以通过字段名称或者字段类型来匹配指定的映射规则,每个模板都有一个名称,你可以用来描述这个模板的用途, 一个mapping来指定映射应该怎样使用,以及至少一个参数 (如 match) 来定义这个模板适用于哪个字段。 
    模板按照顺序来检测;第一个匹配的模板会被启用 
    • match 参数只匹配字段名称
    • match_mapping_type 允许你应用模板到特定类型的字段上,就像有标准动态映射规则检测的一样
  • “fielddata”:boolean //针对分词字段,参与排序或聚合时能提高性能,默认是false,false是不允许聚合操作的
  • “boost”:1.23 // 权重:字段级别的分数加权,指定字段在搜索时所占的权重,所占的百分比
  • “fields”:{“raw”:{“type”:”keyword”}} //可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词,应用场景:即可以用于对字符串进行字符排序,也可以全文索引,排序时使用字段.raw来引用排序字段
  • “index”: “analyzed”, // 指定文本类型的字段是否分词、是否存储该字段的值(在新版本中index值为boolean类型,语意也发生了变化,TODO待更新),有三个值: 
    • analyzed:首先分析字符串,然后索引(存储)它。换句话说,以全文索引这个域(也就是说即分词,又存储字段的值,即可以通过全文检索的方式对该字段进行搜索)
    • not_analyzed:索引(存储)这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析(不对字段的值进行分词,而是完整的存储该值,所以只能通过精确值才能搜索出来,即完全匹配,相当于sql中的等号=的作用)
    • no:不索引这个域。这个域不会被搜索到(对该字段不分词,也不存储,相当于没有这个字段一样???)
  • “store”:false//是否单独设置此字段的是否存储而从_source字段中分离,默认是false,只能搜索,不能获取值
  • “doc_values”:false//对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存
  • “ignore_above”:100 //超过100个字符的文本,将会被忽略,不被索引
  • “include_in_all”:ture//设置是否此字段包含在_all字段中,默认是true,除非index设置成no选项
  • “index_options”:”docs”//4个可选参数docs(索引文档号) ,freqs(文档号+词频),positions(文档号+词频+位置,通常用来距离查询),offsets(文档号+词频+位置+偏移量,通常被使用在高亮字段)分词字段默认是position,其他的默认是docs
  • “norms”:{“enable”:true,”loading”:”lazy”}//分词字段默认配置,不分词字段:默认{“enable”:false},存储长度因子和索引时boost,建议对需要参与评分字段使用 ,会额外增加内存消耗量
  • “null_value”:”NULL”//设置一些缺失字段的初始化值,只有string可以使用,分词字段的null值也会被分词
  • “position_increament_gap”:0//影响距离查询或近似查询,可以设置在多值字段的数据上火分词字段上,查询时可指定slop间隔,默认值是100
  • “similarity”:”BM25”//默认是TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效
  • “term_vector”:”no”//默认不存储向量信息,支持参数yes(term存储),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用

settings设置

settings用于设置索引的分片数量、副本数量、默认的分词器等,Elasticsearch 提供了优化好的默认配置。 除非你理解这些配置的作用并且知道为什么要去修改,否则不要随意修改。

  • “number_of_shards” : 5, // 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
  • “number_of_replicas” : 1, // 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。
  • “analysis” : { “analyzer” : { “ik” : { “tokenizer” : “ik_ max_word” } } }
// 创建只有 一个主分片,没有副本的小索引:
PUT /my_temp_index
{
    "settings": {
        "number_of_shards" :   1,
        "number_of_replicas" : 0
    }
}
// 用update-index-settings API 动态修改副本数:
PUT /my_temp_index/_settings
{
    "number_of_replicas": 1
}

aliases别名

索引别名就像一个快捷方式或软连接,或者是一个指向,都是最终指的同一个东西,别名 带给我们极大的灵活性,允许我们做下面这些:

  • 在运行的集群中可以无缝的从一个索引切换到另一个索引
  • 给多个索引分组 (例如, last_three_months)
  • 给索引的一个子集创建 视图

有两种方式管理别名: _alias用于单个操作, _aliases用于执行多个原子级操作。

Mapping一旦创建是不允许修改字段的数据类型的,为了防止以后有可能修改索引的情况,刚开始创建索引时最好就为该索引创建一个别名,然后在程序中直接使用别名,而不使用真实的索引名称。 
如果后面需要要修改映射,可以再创建一个新的索引,然后把之前索引里的数据导入到新创建的索引里, 为新索引增加一个别名,将别名从老索引中移除,这样应用程序仍然使用的是别名,而这个别名已经指向了新的索引,这样就达到了不修改索引名而修改索引的目的。

// 0. 创建索引(age的类型为long)
PUT /school_v1
{
  "mappings": {
    "students": {
      "properties": {
        "name": { "type": "text" },
        "age": {"type": "long"}
      }
    }
  }
}

// 1. 为索引创建一个别名
PUT /school_v1/_alias/school

// 查看别名指向的索引
GET /*/_alias/school 
// 查询索引对应的别名
GET /school_v1/_alias/*

// 2.创建一个新的索引,名字不能和之前的不一样,这次将age的数据类型改为short
PUT /school_v2
{
  "mappings": {
    "students": {
      "properties": {
        "name": { "type": "text" },
        "age": {"type": "short"}
      }
    }
  }
}

// 3.迁移数据:将之前的索引里的文档迁移到新的索引上
// 先将数据批量查询出来,然后批量插入
GET /school/students/_search?scroll=1m

POST /schools/students/_bulk
{"index": {"_id": 1}}
{"name": "张三","age": 27}
{"index": {"_id": 2}}
{"name": "小明","age": 28}

GET /schools/students/_search

// 4.为新索引增加别名,别名名称为老索引名称,这样系统可以直接使用老索引的名称来操作新索引
POST /_aliases 
{
  "actions": [
    {
      "add": { "index": "school_v2", "alias": "school"},
      "remove": { "index": "school_v1", "alias": "school"}
    }
  ]
}

GET /school/students/_search

别名就是索引的另一个名字,就像人的姓名和笔名一样,都是指向的同一个人,可以通过POST /_aliases 路径对别名进行add、remove操作

创建索引

// 注意:当前创建的索引的动态映射配置根对象是不允许添加新字段的,动态映射类型为严格类型,但是内部对象是允许添加新字段的
PUT /shop_v1
{
    "aliases": {
      "shop": {}
    },
//设置索引的分片数量、副本数量、默认的分词器等
    "settings" : {
        "number_of_shards" :   5,         
        "number_of_replicas" : 1, 
//refresh_interval:索引刷新时间间隔,一个持续时间值, 例如 1s(1 秒) 或 2m(2 分钟)。 
//一个绝对值1表示的是1毫秒 –无疑会使你的集群陷入瘫痪, -1:表示关闭刷新, 默认为一秒,
//如果索引了一个文档然后立即尝试搜索它,但却没有搜到,可能是还没有到间隔时间,还没有刷新
        "refresh_interval": "1s", 
        "analysis" : {
            "analyzer" : {
                "ik" : {
                    "tokenizer" : "ik_max_word"
                }
            }
        }
    },
    "mappings": {
//设置类型
      "goods": {
//为strict时,当有新字段添加时就会报异常
        "dynamic": "strict",
//动态模板:为满足条件的字段做统一映射,可以通过字段名称或者字段类型来匹配指定的映射规则
        "dynamic_templates":[
            { "date": {
                      //匹配字段名
                      "match": "*_date", 
                      //匹配字段类型
                      "match_mapping_type": "date",
                      "mapping": {
                          "type": "date",
                          "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
                      }
            }},
            { "ik": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":           "text",
                      "analyzer": "ik_max_word",
                      "search_analyzer": "ik_max_word"
                  }
            }}
         ],
        "properties": {
          "name": {
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_max_word"
          },
          "price": {
            "type": "double"
          },
          "quantity": {
            "type": "integer"
          },
          "colors": {
            "type": "keyword"
          },
          "is_discount": {
            "type": "boolean"
          },
          "create_date": {
            "type": "date",
            "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          },
          "ip_addr": {
            "type": "ip"
          },
          "location": { 
              "type": "geo_point",
              "lat_lon": true
          },
// 当数据类型是object时,需要具体指定内部对象对应的字段,相当于Student里有个tearcher对象
          "merchant": {
            "type": "object",
            "dynamic": true,
            "properties": {
                    "id":           { "type": "long" },
                    "shop_name":    { "type": "text" }
             }    
          },
          //可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
          "cpu": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "params": {
//nested : 嵌套对象, 用于数组中的元素是对象的,也就是Class类里有个List<Student>
             "type":     "nested",
             "properties": {
                "id": { "type": "long" },
                "label": { "type": "text" },
                "value": { "type": "text" }
             }
         }
        }
      }
    }
  }

猜你喜欢

转载自blog.csdn.net/AAA821/article/details/81947664