一文搞懂目前流行的elasticsearch,可以用来做搜索、日志收集等通途。使用6.1.1版本。

一些术语

  • 文档Document
    • 用户存储在es中的数据文档
  • 索引Index
    • 有相同字段的文档Document列表组成
  • 节点Node
    • 一个es的实例,集群的构成单元
  • 集群Cluster
    • 有一个或多个节点组成,对外提供服务
  • shard(分片)
    • 将索引切割成为的物理存储组件:但每一个shard都是一个独立且完整的索引。 创建索引时,es 默认将其分割为5个shard,用户也可以按需自定义, 创建完成之后不可修改。
    • shard 有2种类型:primary shard 和replica(用于数据冗余及查询时代负载均衡) 每个主shard的副本数量可以自定义,且可动态修改. 每个分片都是lucene索引 备份:拷贝一份分片,就完成了分片的备份

Document

json object 由字段(field)组成,常见数据类型如下

  • 字符串:text,keyword

  • 数值型:long,integer,short,byte,double,float,half_float,scaled_float

  • 布尔:boolean

  • 日期:date

  • 二进制:binary

  • 范围类型:integer_range,float_range,long_range,double_range,date_range

每个文档由唯一的id标识

  • 自行指定

  • es自动生成

Document MetaData

元数据,用于标注文档的相关信息

  • _index 文档所在索引名
  • _type 文档所在的类型名
  • _id 文档唯一id
  • _uid 组合id,由 _type和 _id组成(6.x type 不再起作用,同 _id一样)
  • _source 文档的原始json数据,可以从这里获取每个字段的值
  • _all 整合所有字段内容到该值,默认禁用

Index 介绍

等同于数据库中的表

索引中存储具有相同结构的文档(document)

每个索引都有自己的mapping定义,用于定义字段名和类型

一个集群可以有多个索引,比如:

nginx日志存储的时候可以按照日期每天生成一个索引来存储

 nginx-log-2020-06-30
 nginx-log-2020-07-01

Restful api

Elasticsearch 集群对外提供restful api

REST :Representational state transfer

URI指定资源,如index,Document等

http method 指明资源操作类型。如get,post,put,delete等

常用两种交互方式

  • curl命令
  • kibana devtools

启动es、kibana

1# 启动es
2bin/elasticsearch -Ecluster.routing.allocation.disk.threshold_enabled=false -Epath.data=crmao
3#浏览器  http://localhost:9200
4
5#启动kibana 使用默认配置
6bin/kibana
7# 浏览器访问 http://127.0.0.1:5601/

Index_api

1put /test_index    创建一个叫test_index的索引
2get _cat/indices   查看现有索引

document api

  • 指定id创建
  • 不指定id创建

指定id创建

 1put /test_index/doc/1           put /index_name/type_name/id
 2{
 3    "username":"crmao",
 4    "age":1
 5}
 6创建文档时,如果索引不存在,es会自动创建对应的index和type
 7
 8
 9{
10  "_index": "test_index",
11  "_type": "doc",
12  "_id": "1",
13  "_version": 1, //每次操作都会加1
14  "result": "created",
15  "_shards": {
16    "total": 2,
17    "successful": 1,
18    "failed": 0
19  },
20  "_seq_no": 0,
21  "_primary_term": 1
22}

不指定id创建

 1post /test_index/doc
 2{
 3    "username":"huang",
 4    "age":27
 5}
 6
 7reponse:
 8{
 9    "_index": "test_index",
10    "_type": "doc",
11    "_id": "AWvKlbzNkKWPJLWbc9FF", //自动生成id
12    "_version": 1,
13    "result": "created",
14    "_shards": {
15        "total": 2,
16        "successful": 1,
17        "failed": 0
18    },
19    "created": true
20}

查询api

 1get /test_index/doc/1
 2get /test_index/doc/_search #查全部默认10个文档
 3
 4get /test_index/doc/_search #指定id 查
 5{
 6    "query":{
 7        "term":{
 8            "_id":"1"
 9        }
10    }
11}

批量操作api

bulk的格式:

action:index/create/update/delete

metadata: _index _type _id

request body:_source (删除操作不需要加request body)

1{ `action`: { `metadata` }}
2{ `request body`        }
1post _bulk
2{"index":{"_index":"test_index","_type":"doc","_id":3}}
3{"username":"maodada1","age":10}
4{"delete":{"_index":"test_index","_type":"doc","_id":1}}
5{"update":{"_index":"test_index","_type":"doc","_id":"3"}}
6{"doc":{"age":22}}

倒排索引

正排索引: 文档id到文档内容,单词的关联关系

文档id 文档内容
1 elasticsearch是最流行的搜索引擎
2 php是世界上最好的语言
3 搜索引擎是如何诞生的

倒排索引: 单词到文档id的关联关系

单词 文档id列表
elasticsearch 1
流行 1
搜索引擎 1,3
php 2
世界 2
语言 2
如何 3
诞生 3

查询包含搜索引擎的文档

  1. 通过倒排搜索获得搜索引擎对应的文档id 1和3
  2. 通过正排索引查询1和3完整内容
  3. 返回用户最终结果

倒排索引详解

倒排索引是搜索引擎的核心,主要包含两部分

  • 单词词典 (term dictionary)
  • 倒排列表(posting list)

单词词典

  • 记录所有文档的单词,一般都比较大
  • 记录单词到倒排列表的关联信息

倒排列表

记录了单词对应的文档集合,由倒排索引项(posting)组成

倒排索引项(posting)主要包含如下信息:

11. 文档id,用于获取原始信息
22. 单词频率(TF,Term Frequency),记录该单词在该文档中的出现次数用于后续相关性算分
33. 位置(position),记录单词在文档中分词位置(多个),用于做词语搜索(phrase query)
44. 偏移(offset),记录单词在文档的开始和结束位置,用于做高亮显示

表1中“搜索引擎”为例

docId TF position offset
1 1 2 (里面有3个单词,它是第三个所以是2) <18,22>
3 1 0 <0,4>

分词

分词是指将文本转换成一系列单词 ( term or token) 也叫文本分析,在es 里面称为Analysis,如下所示

1文本: elasticsearch 是最流行的搜索引擎
2分词结果: elasticsearch 、 流行 、 搜索引擎

分词器是es中专门处理分词的组件,英文为Analyzer,它的组成如下:

  • Character Filters
    • 针对原始文本进行处理,比如去除html特殊标记符
  • Tokenizer
    • 将原始文本按照一定规则切分单词
  • Token Filters
    1 针对tokenizer 处理的单词进行再加工,比如 小写, 新增, 删除等处理 (如 这 ,的, 那    这些词进行删除, 近义词 进行增加)
    

分词器调用顺序 Character Filters->Tokenizer->Token Filters

Analyze Api

es提供了一个测试分词的api 接口,方便验证分词效果,endpoint是 _analyze

  1. 可以直接指定 analyzer(分词器) 进行测试
  2. 可以直接指定索引中的字段进行测试
  3. 可以自定义分词器进行测试

指定 analyzer(分词器) 进行测试

 1post 127.0.0.1:9200/_analyze
 2{
 3	"analyzer":"standard",
 4	"text":"hello world!"
 5}
 6
 7
 8reponse:
 9{
10    "tokens": [
11        {
12            "token": "hello",
13            "start_offset": 0,
14            "end_offset": 5,
15            "type": "<ALPHANUM>",
16            "position": 0
17        },
18        {
19            "token": "world",
20            "start_offset": 6,
21            "end_offset": 11,
22            "type": "<ALPHANUM>",
23            "position": 1
24        }
25    ]
26}

指定索引中的字段进行测试

1POST text_index/_analyze
2{
3    "field":"username",  #  测试字段
4    "text":"hello world" # 测试文本
5}

自定义分词器进行测试

1POST _analyze
2{
3    "tokenizer":"standard",
4    "filter":["lowercase"],
5    "text":"Hello World"
6}

自带分词器

  • standard
  • simple
  • whitespace
  • stop
  • keyword
  • pattern
  • Language
1post /_analyze
2{
3	"analyzer":"simple",
4	"text":"The 2 QUICK Brown..."
5}

中文分词

自定义分词

当自带的分词无法满足需求时,可以自定义分词

通过自定义character filters,tokenizer 和token filter 实现

character filters

  • 在tokenizer 之前对原始文本进行处理,比如增加、删除或替换字符
  • 自带如下:
    • HTML Strip去除html标签和转换html实体
    • Mapping 进行字符替换操作
    • Pattern Replace 进行正则匹配替换
  • 会影响后续 在tokenizer 解析的postion和offset信息

测试使用

 1POST _analyze
 2{
 3    "tokenizer":"keyword",
 4    "char_filter":["html_strip"],
 5    "text":"<p>I&apos;m so <b>happy</b>!</p>"
 6}
 7
 8response:
 9{
10  "tokens": [
11    {
12      "token": """
13
14I'm so happy!
15
16""",
17      "start_offset": 0,
18      "end_offset": 32,
19      "type": "word",
20      "position": 0
21    }
22  ]
23}

tokenizer

  • 将原始文本按照一定规则切分为单词(term or token)
  • 自带的如下:
    • standard 按照单词进行分割
    • letter 按照非字符类型进行分割
    • whitespace 按照空格进行分割
    • UAX URL Email 按照standard 分割,但不会分割邮箱和url
    • NGram 和 Edge NGram连词分割
    • Path Hierarchy 按照文件路径进行分割

测试如下:

 1POST /_analyze
 2{
 3     "tokenizer":"path_hierarchy",
 4     "text":"/one/two/three" 
 5}
 6response:
 7{
 8  "tokens": [
 9    {
10      "token": "/one",
11      "start_offset": 0,
12      "end_offset": 4,
13      "type": "word",
14      "position": 0
15    },
16    {
17      "token": "/one/two",
18      "start_offset": 0,
19      "end_offset": 8,
20      "type": "word",
21      "position": 0
22    },
23    {
24      "token": "/one/two/three",
25      "start_offset": 0,
26      "end_offset": 14,
27      "type": "word",
28      "position": 0
29    }
30  ]
31}

Token filters

  • 对于 tokenizer输出的单词(term)进行增加、删除、修改等操作
  • 自带的如下:
    • lowercase 将所有term转换为小写
    • stop删除stop words
    • Synonym添加近义词的term
    • Ngram 和 Edge NGram连词分割
 1POST _analyze
 2{
 3    "text":"a Hello,World!",
 4    "tokenizer":"standard",
 5    "filter":[
 6        "stop",
 7        "lowercase",
 8        {
 9            "type":"ngram", //切割
10            "min_gram":4, //切割最小长度
11            "max_gram":4  //切割最大长度
12        }
13    ]
14}

自定义分词api

自定义分词需要再索引的配置中设定

 1PUT /test_index
 2{
 3    "settings":{
 4        "analysis":{
 5            "analyzer":{
 6                "analyzer_name":{
 7                   "char_filter":{},
 8                    "tokenizer":{},
 9                    "filter":{}, 
10                }
11            },
12            "tokenizer":{}, //自定义的
13            "char_filter":{},//自定义的
14            "filter":{} //自定义的
15        }
16    
17    }
18}

例子如下:

 1delete /test_index
 2PUT /test_index
 3{
 4    "settings":{
 5        "analysis":{
 6            "analyzer":{
 7                "my_custom_analyzer":{
 8                    "type":"custom",
 9                   "char_filter":[
10                    "html_strip"
11                   ],
12                    "tokenizer":"standard",
13                    "filter":[
14                        "lowercase",
15                        "asciifolding"
16                    ]
17                }
18            }
19            
20        }
21    }
22}

使用自定义分词器

 1POST /test_index/_analyze
 2{
 3    "analyzer":"my_custom_analyzer",
 4    "text":"Is this <b>a box</b>?"
 5}
 6
 7response:
 8{
 9  "tokens": [
10    {
11      "token": "is",
12      "start_offset": 0,
13      "end_offset": 2,
14      "type": "<ALPHANUM>",
15      "position": 0
16    },
17    {
18      "token": "this",
19      "start_offset": 3,
20      "end_offset": 7,
21      "type": "<ALPHANUM>",
22      "position": 1
23    },
24    {
25      "token": "a",
26      "start_offset": 11,
27      "end_offset": 12,
28      "type": "<ALPHANUM>",
29      "position": 2
30    },
31    {
32      "token": "box",
33      "start_offset": 13,
34      "end_offset": 20,
35      "type": "<ALPHANUM>",
36      "position": 3
37    }
38  ]
39}

分词使用说明

分词会在如下两个时机使用:

  • 创建或更新文档时(index time),会对相应的文档进行分词处理
  • 查询时(search time),会对查询语句进行分词,分词后进行查询

索引时分词

索引时分词是通过配置index mapping 的中每个字段的analyzer属性实现的,不指定分词时,使用默认的standard。

 1PUT test_index
 2{
 3    "mappings":{
 4        "doc":{
 5            "properties":{
 6                "title":{
 7                    "type":"text",
 8                    "analyzer":"whitespace" //指定分词器
 9                }
10            }
11        }
12    }
13}

查询时分词

查询时分词的指定方式

  • 查询的时候通过analyzer指定分词器
  • 通过index mapping设置 search_analyzer实现 (用这个)
 1POST /test_index/_search
 2{
 3    "query":{
 4        "match":{
 5            "message":{
 6                "query":"hello",
 7                "analyzer":"standard"
 8            }
 9        }
10    }
11}
12
13put /test_index
14{
15    "mappings":{
16        "doc":{
17            "properties":{
18                "title":{
19                    "type":"text",
20                    "analyzer":"whitespace",
21                    "search_analyzer":"whitespace",
22                }
23            }
24        }
25    }
26}

一般不需要特别指定查询时分词器,直接使用索引时分词器即可,否则会出现无法匹配的情况

分次使用建议

  • 名气是否需要分词,不需要分析的字段,将type设置为keyword,省空间和提高写性能
  • 善用_analyze api 查看文档的具体分词结果
  • 动手测试

mapping 设置

类似数据中的表结构定义,主要作用如下:

  • 定义index下单字段名(field name)
  • 定义字段的类型,比如数值型,字符型,布尔型等
  • 定义倒排索引相关的配置,比如是否索引,记录position等

查看索引

 1get  127.0.01:9200/test_index/_mapping    
 2{
 3    "test_index": {
 4        "mappings": {
 5            "doc": {  //doc  是type 
 6                "properties": {
 7                    "age": {
 8                        "type": "long"
 9                    },
10                    "username": {
11                        "type": "text",
12                        "fields": {
13                            "keyword": {
14                                "type": "keyword",
15                                "ignore_above": 256
16                            }
17                        }
18                    }
19                }
20            }
21        }
22    }
23}

自定义mapping

 1//创建索引
 2put my_index
 3{
 4     "mappings": {
 5            "doc": {  //doc  是type 
 6                "properties": {
 7                    "age": {
 8                        "type": "long"
 9                    },
10                    "username": {
11                        "type": "text",
12                        "fields": {
13                            "keyword": {
14                                "type": "keyword",
15                                "ignore_above": 256
16                            }
17                        }
18                    }
19                }
20            }
21        }
22}

mapping中的字段类型一旦设定后,禁止直接修改,原因如下:

  • lucene实现的倒排索引生成后不允许修改
  • 重新建立新的索引,然后做reindex操作
  • 允许新增字段
  • 通过dynamic参数来控制字段的新增
    • true(默认) 允许自动新增字段
    • false 不允许自动新增字段,但是文档可以正常写入,但无法对字段做查询操作
    • strict文档不能写入 报错

如果一个字段是object类型, 可以针对这个字段设置dynamic 属性,那么作用域只针对这个字段的。

索引设置dynamic 参数 为false演示

  1DELETE  /my_index 
  2//创建索引 指定dynamic 为false
  31. put /my_index
  4{
  5     "mappings": {
  6            "doc": {  
  7            	"dynamic":false,  
  8                "properties": {
  9                    "age": {
 10                        "type": "integer"
 11                    },
 12                    "username": {
 13                        "type": "text"
 14                        }
 15                    }
 16                    
 17                }
 18            }
 19        }
 20}
 21
 22
 232. put /my_index/doc/1
 24{
 25    "username":"othing here",
 26    "desc":"nothing here"            //不存在的字段
 27}
 28
 29
 303. get /my_index/doc/1
 31reponse:
 32{
 33    "_index": "my_index",
 34    "_type": "doc",
 35    "_id": "1",
 36    "_version": 1,
 37    "found": true,
 38    "_source": {
 39        "username": "othing here",
 40        "desc": "nothing here"
 41    }
 42}
 43
 44
 454. get /my_index/doc/_search
 46{
 47    "query":{
 48        "match":{
 49            "username":"here"
 50        }
 51    }
 52}
 53reponse: 得到一条结果
 54{
 55    "took": 36,
 56    "timed_out": false,
 57    "_shards": {
 58        "total": 5,
 59        "successful": 5,
 60        "skipped": 0,
 61        "failed": 0
 62    },
 63    "hits": {
 64        "total": 1,
 65        "max_score": 0.25811607,
 66        "hits": [
 67            {
 68                "_index": "my_index",
 69                "_type": "doc",
 70                "_id": "1",
 71                "_score": 0.25811607,
 72                "_source": {
 73                    "username": "nothing here",
 74                    "desc": "nothing here"
 75                }
 76            }
 77        ]
 78    }
 79}
 80
 81
 825. get /my_index/doc/_search
 83{
 84    "query":{
 85        "match":{
 86            "desc":"here"
 87        }
 88    }
 89}
 90reponse: 没有结果
 91{
 92    "took": 17,
 93    "timed_out": false,
 94    "_shards": {
 95        "total": 5,
 96        "successful": 5,
 97        "skipped": 0,
 98        "failed": 0
 99    },
100    "hits": {
101        "total": 0,
102        "max_score": null,
103        "hits": []
104    }
105}

copy_to 参数选项

  • 将字段的值复制到目标字段,实现类似_all的作用
  • 不会出现在_source中,只用来搜索
 1DELETE /my_index
 2put /my_index
 3{
 4    "mappings":{
 5        "doc":{
 6            "properties":{
 7                "first_name":{
 8                    "type":"text",
 9                    "copy_to":"full_name"
10                },
11                "last_name":{
12                    "type":"text",
13                    "copy_to":"full_name"
14                },
15                "full_name":{
16                    "type":"text"
17                }       
18            }   
19        }
20    } 
21}
22
23put /my_index/doc/1
24{
25    "first_name":"mao"
26    "last_name":"zhongyu"
27}
28
29get /my_index/doc/1
30{
31    "_index": "my_index",
32    "_type": "doc",
33    "_id": "1",
34    "_version": 1,
35    "found": true,
36    "_source": {
37        "first_name": "mao",
38        "last_name": "zhongyu"
39    }
40}
41
42
43get  /my_index/doc/_search
44{
45    "query":{
46    	"match":{
47                  "full_name":{
48                      "query":"mao zhongyu",
49                      "operator":"and"     // and 必须包含mao zhongyu搜的出来
50                  }
51    	}
52  
53    }
54}
55
56reponse:
57{
58    "took": 3,
59    "timed_out": false,
60    "_shards": {
61        "total": 5,
62        "successful": 5,
63        "skipped": 0,
64        "failed": 0
65    },
66    "hits": {
67        "total": 1,
68        "max_score": 0.51623213,
69        "hits": [
70            {
71                "_index": "my_index",
72                "_type": "doc",
73                "_id": "1",
74                "_score": 0.51623213,
75                "_source": {
76                    "first_name": "mao",
77                    "last_name": "zhongyu"
78                }
79            }
80        ]
81    }
82}

index 参数选项

控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索

设置false,可以不存倒排索引能省大量的空间

 1DELETE /my_index
 2put /my_index
 3{
 4    "mappings":{
 5        "docs":{
 6            "properties":{
 7                "cookie":{
 8                    "type":"text",
 9                    "index":false
10                }
11            }
12        }
13    }
14}
15
16put /my_index/doc/1
17{
18    "cookie":"name=maozhongyu"
19}
20
21get /my_index/doc/_search //报错
22{
23	"query":{
24        "match":{
25            "cookie":"name"
26        }
27	}    
28}

index_options 参数选项

index_options 用于控制倒排索引记录的内容,有如下4种配置

  • docs 只记录doc id

  • frees 记录doc id 和term frequencies

  • options 记录doc id 、term frequencies和 term position

  • offsets记录doc id 、term frequencies 、term position 和 character offsets

text类型的默认设置为 options 其他默认为docs

记录的内容越多,占用空间越大

 1举例
 2put /my_index
 3{
 4    "mappings":{
 5        "doc":{
 6            "properties":{
 7                "cookie":{
 8                    "type":"text",
 9                    "index_options":"offsets"
10                }
11            }
12        }
13    }
14}

null_value 参数选项

当字段遇到null 值时代处理策略,默认为null,即空值,此时es为忽略该值。可以通过设定该值设定字段的默认值

 1put /my_index
 2{
 3   "mappings":{
 4        "doc":{
 5            "properties":{
 6                "status_code":{
 7                    "type":"integer",
 8                    "null_value":500,
 9                }
10            }
11        }
12    }
13}

数据类型

核心数据类型

https://www.elastic.co/guide/en/elasticsearch/reference/6.0/mapping-types.html

  • 字符串 text(分词)、keyword (不分词)
  • 数值型 long、integer、short、byte、double、float、half_float、scaled_float
  • 日期类型 date
  • 布尔类型 boolean
  • 二进制类型 binary
  • 范围类型 integer_range 、float_range、long_range、double_range、date_range

复制数据类型

  • 数组类型 array 其实就是多了几个term
  • 对象类型 object for single JSON objects (子字段)
  • 嵌套类型 nested for arrays of JSON objects

地理位置数据类型

  • geo_point
  • geo-shape

专用类型

  • 记录ip地址 ip

  • 实现自动补全 completion

  • 记录分词数 token_count

  • 记录字符串hash值 murmur3

    ….

多字段特性 multi-fields

允许对同一个字段采用不同的配置, 比如分词。

举例如 对人对姓名进行搜索,还要支持拼音搜索

只需要在人名中新增一个子字段为pinyin即可 ,不用横向加一个字段pinyin ,然后对pinyin这个字段进行搜索

 1{
 2    "test_index":{
 3        "mappings":{
 4            "doc":{
 5                "properties":{
 6                    "username":{
 7                        "type":"text",
 8                        "fields":{
 9                            "pinyin":{
10                                "type":"text",
11                                "analyzer":"pinyin"
12                            }
13                        }
14                    }
15                }
16            }
17        }
18    }
19}
20
21
22搜索
23get /text_index/doc/_search
24{
25    "query":{
26        "match":{
27            "username.pinyin":"search  name"
28        }
29    }
30}

dynamic mapping

dynamic field mapping

如果没有索引的情况下,可以动态创建索引

 1DELETE /my_index
 2put /my_index/doc/1
 3{
 4    "username":"maozhongyu",
 5    "age":1,
 6    "birth":"1988-10-01",
 7    "married":false,
 8    "year":"18",
 9    "tags":["boy","fashion"],
10    "money":100.1,
11    "fnum":"100.1"
12}
13get  /my_index/_mapping
14{
15    "my_index": {
16        "mappings": {
17            "doc": {
18                "properties": {
19                    "age": {
20                        "type": "long"
21                    },
22                    "birth": {
23                        "type": "date"
24                    },
25                    "fnum": {
26                        "type": "text",
27                        "fields": {
28                            "keyword": {
29                                "type": "keyword",
30                                "ignore_above": 256
31                            }
32                        }
33                    },
34                    "married": {
35                        "type": "boolean"
36                    },
37                    "money": {
38                        "type": "float"
39                    },
40                    "tags": {
41                        "type": "text",
42                        "fields": {
43                            "keyword": {
44                                "type": "keyword",
45                                "ignore_above": 256
46                            }
47                        }
48                    },
49                    "username": {
50                        "type": "text",
51                        "fields": {
52                            "keyword": {
53                                "type": "keyword",
54                                "ignore_above": 256
55                            }
56                        }
57                    },
58                    "year": {
59                        "type": "text",
60                        "fields": {
61                            "keyword": {
62                                "type": "keyword",
63                                "ignore_above": 256
64                            }
65                        }
66                    }
67                }
68            }
69        }
70    }
71}

es是依靠json你文档的字段类型来实现自动识别字段类型

上面string 自动识别的时候, 默认日期开启, 浮点数和整数字符串 未开启

日期识别

默认开启日期识别,

默认的识别

[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]

所有 strict_date_optional_time 格式 参见

https://www.elastic.co/guide/en/elasticsearch/reference/6.0/mapping-date-format.html#strict-date-time

 1 date-opt-time     = date-element ['T' [time-element] [offset]]
 2 date-element      = std-date-element | ord-date-element | week-date-element
 3 std-date-element  = yyyy ['-' MM ['-' dd]]
 4 ord-date-element  = yyyy ['-' DDD]
 5 week-date-element = xxxx '-W' ww ['-' e]
 6 time-element      = HH [minute-element] | [fraction]
 7 minute-element    = ':' mm [second-element] | [fraction]
 8 second-element    = ':' ss [fraction]
 9 fraction          = ('.' | ',') digit+
10 
1举例
2PUT my_index/my_type/1
3{
4  "create_date": "2015/09/02"
5}
6
7GET my_index/_mapping

禁用日期识别 ,date_detection参数设置为false

 1PUT my_index
 2{
 3  "mappings": {
 4    "my_type": {
 5      "date_detection": false
 6    }
 7  }
 8}
 9
10PUT my_index/my_type/1 
11{
12  "create": "2015/09/02"
13}
14The create_date field has been added as a text field.

自定义日期识别

设置dynamic_date_formats 参数指定格式

 1举例
 2PUT my_index
 3{
 4  "mappings": {
 5    "my_type": {
 6      "dynamic_date_formats": ["MM/dd/yyyy"]
 7    }
 8  }
 9}
10
11PUT my_index/my_type/1
12{
13  "create_date": "09/25/2015"
14}

数字识别

设置 numeric_detection 参数为true ,默认不开启

 1PUT my_index
 2{
 3  "mappings": {
 4    "my_type": {
 5      "numeric_detection": true
 6    }
 7  }
 8}
 9
10PUT my_index/my_type/1
11{
12  "my_float":   "1.0", 
13  "my_integer": "1" 
14}
15
16	
17The my_float field is added as a double field.
18The my_integer field is added as a long field.

下载地址

Elasticsearch手册地址

Elasticsearch-PHP