当前位置:   article > 正文

ElasticSearch索引的映射(Mapping)配置_elasticsearch 创建索引mapping

elasticsearch 创建索引mapping

下文详细介绍ElasticSearch索引的映射(Mapping)配置,详细信息请参考《Elasticsearch Reference [2.4] » Mapping》。注意,ElasticSearch引擎是大小写敏感的,强制性要求索引名和文档类型小写,对于字段名,ElasticSearch引擎会将首字母小写,建议在配置索引,文档类型和字段名时,都使用小写字母。

二,索引映射节(mappings)

1,索引结构

索引是由文档类型构成的,在mappings字段中定义索引的文档类型,示例代码中为blog索引定义了三个文档类型:articles,followers和comments

  1. {
  2. "mappings":{
  3. "articles":{ },
  4. "followers":{ },
  5. "comments":{ }
  6. }
  7. }

2,文档属性

文档属性定义了文档类型的共用属性,适用于文档的所有字段:

  • dynamic_date_formats属性:该属性定义可以识别的日期格式列表;
  • dynamic属性:默认值为true,允许动态地向文档类型中加入新的字段。推荐设置为false,禁止向文档中添加字段,这样,文档类型的所有字段必须在索引映射的properties属性中显式定义,在properties字段中未定义的字段都将会ElasticSearch忽略。
    • dynamic设置为ture:默认值,新增加的字段被添加到索引映射中;
    • dynamic设置为false:新增加的字段会被忽略;
    • dynamic设置为strict:当向文档中新增字段时,ElasticSearch引擎抛出异常;
  1. {
  2. "mappings":{
  3. "articles":{ "dynamic":false,
  4. "dynamic_date_formats":["yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd" ],
  5. "properties":{
  6. "id":{},
  7. "title":{},
  8. "author":{},
  9. "content":{},
  10. "postedat":{}
  11. }
  12. }
  13. }
  14. }

三,文档的字段属性

1,字段的数据类型

字段的数据类型由字段的属性type指定,ElasticSearch支持的基础数据类型主要有:

  • 字符串类型:string;
  • 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double;
  • 布尔类型:boolean,值是true或false;
  • 时间/日期类型:date,用于存储日期和时间;
  • 二进制类型:binary;
  • IP地址类型:ip,以字符串形式存储IPv4地址;
  • 特殊数据类型:token_count,用于存储索引的字数信息

在文档类型的properties属性中,定义字段的type属性,指定字段的数据类型,属性properties 用于定义文档类型的字段属性,或字段对象的属性:

  1. "properties":{
  2. "id":{"type":"long"},

2,字段的公共属性

  • index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:
    • analyzed:表示该字段被分析,编入索引,产生的token能被搜索到;
    • not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中作为单个词;
    • no:不编入索引,无法搜索该字段;
    • 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。
  • store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段值不会存储,这意味着,该字段能够被查询,但是不会存储字段的原始值。
  • boost:字段级别的助推,默认值是1,定义了字段在文档中的重要性/权重;
  • include_in_all:该属性指定当前字段是否包括在_all字段中,默认值是ture,所有的字段都会包含_all字段中;如果index=no,那么属性include_in_all无效,这意味着当前字段无法包含在_all字段中。
  • copy_to:该属性指定一个字段名称,ElasticSearch引擎将当前字段的值复制到该属性指定的字段中;
  • doc_values:文档值是存储在硬盘上的索引时(indexing time)数据结构,对于not_analyzed字段,默认值是true,analyzed string字段不支持文档值;
  • fielddata:字段数据是存储在内存中的查询时(querying time)数据结构,只支持analyzed string字段;
  • null_value:该属性指定一个值,当字段的值为NULL时,该字段使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,当一个字段设置为NULL值,ElasticSearch引擎认为该字段没有任何值,使用该属性为NULL字段设置一个指定的值,使该字段能够被索引和搜索。

3,字符串类型常用的其他属性

  • analyzer:该属性定义用于建立索引和搜索的分析器名称,默认值是全局定义的分析器名称,该属性可以引用在配置结点(settings)中自定义的分析器;
  • search_analyzer:该属性定义的分析器,用于处理发送到特定字段的查询字符串;
  • ignore_above:该属性指定一个整数值,当字符串字段(analyzed string field)的字节数量大于该数值之后,超过长度的部分字符数据将不能被analyzer处理,不能被编入索引;对于 not analyzed string字段,超过长度的部分字符将被忽略,不会被编入索引。默认值是0,禁用该属性;
  • position_increment_gap:该属性指定在相同词的位置上增加的gap,默认值是100;
  • index_options:索引选项控制添加到倒排索引(Inverted Index)的信息,这些信息用于搜索(Search)和高亮显示:
    • docs:只索引文档编号(Doc Number)
    • freqs:索引文档编号和词频率(term frequency)
    • positions:索引文档编号,词频率和词位置(序号)
    • offsets:索引文档编号,词频率,词偏移量(开始和结束位置)和词位置(序号)
    • 默认情况下,被分析的字符串(analyzed string)字段使用positions,其他字段使用docs; 

分析器(analyzer)把analyzed string 字段的值,转换成标记流(Token stream),例如,字符串"The quick Brown Foxes",可能被分解成的标记(Token)是:quick,brown,fox。这些词(term)是该字段的索引值,这使用对索引文本的查找更有效率。字段的属性 analyzer 用于指定在index-time和search-time时,ElasticSearch引擎分解字段值的分析器名称。

4,数值类型的其他属性

  • precision_step:该属性指定为数值字段每个值生成的term数量,值越低,产生的term数量越高,范围查询越快,索引越大,默认值是4;
  • ignore_malformed:忽略格式错误的数值,默认值是false,不忽略错误格式,对整个文档不处理,并且抛出异常;
  • coerce:默认值是true,尝试将字符串转换为数值,如果字段类型是整数,那么将小数取整;

5,日期类型的其他属性

  • format:指定日期的格式,例如:“yyyy-MM-dd hh:mm:ss”
  • precision_step:该属性指定数值字段每隔多少数值,生成一个词(term);step值越低,产生的词数量越高,范围查询越快,索引越大,占用存储空间越大;
  • ignore_malformed:忽略错误格式,默认值是false,不忽略错误格式;

6,多字段(fields)

在fields属性中定义一个或多个字段,该字段的值和当前字段值相同,可以设置一个字段用于搜索,一个字段用于排序等。

  1. "properties":
  2. {
  3. "id":{ "type":"long",
  4. "fields":{ "id2":{"type":"long","index":"not_analyzed"} }
  5. },

7,文档值(doc_values) 

默认情况下,多数字段都被一起编入索引,用户使用倒排索引(Inverted Index)可以搜索到相应的词(Term),倒排索引支持在唯一的有序词列表中查找特定词,或检查文档中是否包含某个词,但是,对于排序(Sort),聚合和在脚本中访问特定字段的值(Field value),这三个操作需要执行不同的数据访问模式,即单字段数据访问:在文档中查找特定的字段,检查该字段是否包含指定的词。

文档值(doc_values)属性指定将字段的值写入到硬盘上的列式结构,实现了单个字段的数据访问模式,能够高效执行排序和聚合搜索。使用文档值的字段将有专属的字段数据缓存实例,无需像普通字段一样倒排。是存储在硬盘上的数据结构,在文档索引时创建。文档值数据存在硬盘上,在文档索引时创建,存储的数据和字段存储在_source 字段的数据相同,文档值支持所有的字段类型,除了analyzed string 字段之外。

默认情况下,所有的字段都支持文档值,默认是启用的(enabled),如果不需要在单个字段上执行排序或聚合操作,或者从脚本中访问指定字段的值,那么,可以禁用文档值,字段的值将不会存储在硬盘空间中。

  1. "properties": {
  2. "status_code": {
  3. "type": "string",
  4. "index": "not_analyzed"
  5. "doc_values": true
  6. },
  7. "session_id": {
  8. "type": "string",
  9. "index": "not_analyzed",
  10. "doc_values": false
  11. }
  12. }

8,字段数据(Fielddata)

字段数据(Fielddata)是存储在内存中的查询时数据结构,只支持analyzed string字段。该数据结构在字段第一次执行聚合,排序或被脚本访问时创建。创建的过程是:在读取整个倒排索引(Inverted Index)时,ElasticSearch从硬盘上加载倒排索引的每个段(Segment),倒转词(Term)和文档的关系,并将其存储在JVM堆内存中。加载字段数据的过程是非常消耗IO资源的,一旦被加载,就被存储在内存中,直到段的生命周期结束。

对于analyzed string字段,fielddata字段是默认启用的,

  1. "text":{
  2. "type":"string",
  3. "fielddata":{ "loading":"lazy"
  4. }
  5. }

9,存储(store)

存储(store)属性指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段的原始值不会存储,这意味着,该字段能够被查询,但是无法获取字段的原始值。默认情况下,该字段的值会被存储到_source字段中,如果想要获取单个或多个字段的值,而不是整个_source字段,可以使用 source filtering 来实现;但是在特定的条件下,只存储一个字段的值是有意义的(make sense),例如,一个article文档包含:title,postdate和content字段,从文档中只获取title和postdate字段,并且使_source 字段包含content字段,必须通过store属性来控制:

  1. "mappings": {
  2. "my_type": {
  3. "properties": {
  4. "title": {
  5. "type": "string",
  6. "store": true
  7. },
  8. "date": {
  9. "type": "date",
  10. "store": true
  11. },
  12. "content": {
  13. "type": "string",
  14. "store": false
  15. }
  16. }
  17. }
  18. }

10,位置增加间隔(position_increment_gap)

对于analyzed string字段,都会考虑把词的位置信息,用于支持位置和短语匹配查询(proximity or phrase queries),例如,有一个字符串字段,该字段中存在多个词“fake”,ElasticSearch引擎会在每个值之间增加一个gap,以防止短语匹配或位置匹配查询出现跨越多个词的异常,这个gap的值就是属性position_increment_gap,默认值是100;

四,元字段

在索引的映射中,元字段(Meta-field)是以下划线开头的字段,部分元字段可以配置,部分元字段不可配置,只能用于返回信息。

1,_all 字段,可以配置

ElasticSearch使用_all字段存储其他字段的数据以便搜索,默认情况下,_all字段是启用的,包含了索引中所有字段的数据,然而这一字段使索引变大,如果不需要,请禁用该字段,或排除某些字段。为了在_all字段中不包括某个特定字段,在字段中设置“include_in_all”属性为false。

禁用_all字段,需要修改映射配置:

  1. {
  2. "articles":{ "_all":{
  3. "enabled":false
  4. }
  5. }
  6. }

2,_source 字段,可以配置

_source字段表示在生成索引的过程中,存储发送到ElasticSearch的原始JSON文档,默认情况下,该字段会被启用,因为索引的局部更新功能依赖该字段。

  1. {
  2. "articles":{
  3. "_source":{
  4. "enabled":true
  5. }
  6. }
  7. }
  8. {
  9. "articles":{
  10. "_source":{
  11. "excludes":["Content","Comments"],
  12. "includes":["author"]
  13. }
  14. }
  15. }

3,_routing 字段,可以配置

路由字段,将一个文档值进行哈希映射,并将该文档路由到指定的分片,路由的公式是:

  1. {
  2. "articles":{
  3. "_routing":{
  4. "required":true
  5. }
  6. }
  7. }

在put 命令中,使用自定义的路由字段,以下示例使用 user1字段作为路由字段更新和查询文档:

  1. PUT my_index/my_type/1?routing=user1
  2. {
  3. "title": "This is a document"
  4. }
  5. GET my_index/my_type/1?routing=user1

4,不可配置的元字段

  • _index:返回文档所属的索引
  • _uid:返回文档的type和id
  • _type:返回文档类型(type)
  • _id:返回文档的ID;
  • _size:返回文档的_source字段中函数的字节数量;
  • _field_names:返回文档中不包含null值的字段名称;

五,索引配置节(settings)

1,配置索引的分片和副本数量

ElasticSearch索引是有一个或多个分片组成的,每个分片是索引的一个水平分区,包含了文档数据的一部分;每个分片有0,1或多个副本,分片的副本和分片存储相同的数据。

示例代码,为索引创建5个分片,分片没有副本:

"settings":{
    "number_of_shards":5,
    "number_of_replicas":0,

2,配置分析器(analyzer)

在配置结点的analysis属性中配置分析器,参考官方文档了解更多,

分词器(tokenizer)是系统预定义的,常用的分词器是:

  • standard:默认值,用于大多数欧洲语言的标准分词器
  • simple:基于非字母字符来分词,并将其转化为小写形式
  • whitespace:基于空格来分词
  • stop:除了simple的所有功能,还能基于停用词(stop words)过滤数据;
  • pattern:使用正则表达式分词;
  • snowball:除了standard提供的分词功能之外,还提供词干提取功能;

过滤器是系统预定义的,常用的过滤器是:

  • asciifolding
  • lowercase
  • kstem

在配置结点中,自定义分析器(analyzer)示例代码:

  1. {
  2. "settings":{
  3. "index":{
  4. "analysis":{
  5. "analyzer":{
  6. "myanalyzer_name":{
  7. "tokenizer":"standard",
  8. "filter":[
  9. "asciifolding",
  10. "lowercase",
  11. "ourEnglishFilter"
  12. ]
  13. }
  14. },
  15. "filter":{
  16. "ourEnglishFilter":{
  17. "type":"kstem"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

六,删除索引

删除索引的语法是: DELETE http://localhost:9200/blog

七,更新索引

索引的更新分为逐个文档的更新和批量文档更新:

1,单个文档(Individual Document)的更新

单个文档更新的语法是:POST http://localhost:9200/blog/articles/1 +文档对象的JSON数据

POST http://localhost:9200/blog/articles/1

文档对象的JSON数据示例如下:

  1. {
  2. "id":1,
  3. "title":"Elasticsearch index",
  4. "Author":"悦光阴",
  5. "content":"xxxxxxxxxxx",
  6. "postedat":"2017-03-14"
  7. }

2,批量文档的更新(Bluk)

批量文档更新的语法是:POST http://localhost:9200/_bulk + 批量文档对象的JSON数据,在_bulk 端进行批量更新操作。

在传递的请求主体中,每一个请求分为两个JSON数据,第一个JSON数据包含操作说明的描述信息,第二个JSON数据包含文档对象:

  1. {
  2. "index":{
  3. "_index":"blog",
  4. "_type":"ariticles",
  5. "_id":1
  6. }
  7. }
  8. {
  9. "id":1,
  10. "title":"Elasticsearch index",
  11. "Author":"悦光阴",
  12. "content":"xxxxxxxxxxx",
  13. "postedat":"2017-03-14"
  14. }
  15. {
  16. "index":{
  17. "_index":"blog",
  18. "_type":"ariticles",
  19. "_id":2
  20. }
  21. }
  22. {
  23. "id":2,
  24. "title":"Elasticsearch index",
  25. "Author":"悦光阴",
  26. "content":"xxxxxxxxxxx",
  27. "postedat":"2017-03-14"
  28. }

八,搜索索引

在_search端对索引数据进行搜索,ES查询的语法非常复杂,总体来说,ElasticSearch支持聚合查询和简单查询。

1,按照路由搜索

路由可以控制文档和查询转发的目的分片,ElasticSearch计算路由字段的哈希值,对于相同的路由值,将产生相同的哈希值,分配到特定的分片上;如果在查询时,指定路由值,那么只需要搜索单个分片而不是整个索引,就能获取查询结果。

路由字段由文档类型的_routing属性定义,在查询时,使用routing参数来查找特定路由的文档:

GET http://localhost:9200/blog/_search?routing=1235&q=article_id=100

2,聚合和简单查询

请阅读《ElasticSearch查询 第一篇:搜索API

 

附:索引的配置文档

  1. {
  2. "settings":{
  3. "number_of_shards":5,
  4. "number_of_replicas":0
  5. },
  6. "mappings":{
  7. "articles":{
  8. "_routing":{
  9. "required":false
  10. },
  11. "_all":{
  12. "enabled":false
  13. },
  14. "_source":{
  15. "enabled":true
  16. },
  17. "dynamic_date_formats":[
  18. "yyyy-MM-dd",
  19. "yyyyMMdd"
  20. ],
  21. "dynamic":"false",
  22. "properties":{
  23. "articleid":{
  24. "type":"long",
  25. "store":true,
  26. "index":"not_analyzed",
  27. "doc_values":true,
  28. "ignore_malformed":true,
  29. "include_in_all":true,
  30. "null_value":0,
  31. "precision_step":16
  32. },
  33. "title":{
  34. "type":"string",
  35. "store":true,
  36. "index":"analyzed",
  37. "doc_values":false,
  38. "ignore_above":0,
  39. "include_in_all":true,
  40. "index_options":"positions",
  41. "position_increment_gap":100,
  42. "fields":{
  43. "title":{
  44. "type":"string",
  45. "store":true,
  46. "index":"not_analyzed",
  47. "doc_values":true,
  48. "ignore_above":0,
  49. "include_in_all":false,
  50. "index_options":"docs",
  51. "position_increment_gap":100
  52. }
  53. }
  54. },
  55. "author":{
  56. "type":"string",
  57. "store":true,
  58. "index":"analyzed",
  59. "doc_values":false,
  60. "ignore_above":0,
  61. "include_in_all":true,
  62. "index_options":"positions",
  63. "position_increment_gap":100,
  64. "fields":{
  65. "author":{
  66. "type":"string",
  67. "index":"not_analyzed",
  68. "include_in_all":false,
  69. "doc_values":true
  70. }
  71. }
  72. },
  73. "content":{
  74. "type":"string",
  75. "store":true,
  76. "index":"analyzed",
  77. "doc_values":false,
  78. "ignore_above":0,
  79. "include_in_all":false,
  80. "index_options":"positions",
  81. "position_increment_gap":100
  82. },
  83. "postat":{
  84. "type":"date",
  85. "store":true,
  86. "doc_values":true,
  87. "format":[
  88. "yyyy-MM-dd",
  89. "yyyyMMdd"
  90. ],
  91. "index":"not_analyzed",
  92. "ignore_malformed":true,
  93. "include_in_all":true,
  94. "null_value":"2000-01-01",
  95. "precision_step":16
  96. }
  97. }
  98. }
  99. }
  100. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/853911
推荐阅读
相关标签
  

闽ICP备14008679号