数据类型(介绍text和keyword易混淆)
Text 类型被用来索引长文本,例如产品介绍或说明。这些文本会被分词器解析,在建立索引文档之前会通过分词器进行分词处理转换成词组。es 可以检索到该文本切分的词组,但是类型的数据不能用来进行过滤、排序和聚合等操作。
Keyword 类型数据不需要进行分词处理,常备用来进过滤、排序和聚合操作。由于不需要建立索引,因此其数据划分时相对说占用更少的内存开销。
创建索引
静态映射
PUT /my_index{"settings": {"number_of_replicas": 1,"number_of_shards": 4},"mappings": {"properties": {"name":{"type": "keyword"},"age":{"type": "integer"}}}}
动态创建
文档写入ES 时,如果index不存在则会自行创建索引、映射类型、字段,并且根据字段推断其数据类型。
对于已经存在的index,如果有一个字段不存在,ES 可以动态添加新字段,可以通过设置dynamic 属性来开启或关闭此特性(默认是开启状态)。
分为动态映射和静态映射
例如,直接向ES 中写入一条数据
POST /my_index/_doc
{
"name":"德普",
"age":10
}
查看my_index自动创建的映射关系
CRUD
插入文档
单条数据插入
Index 不存在时,使用POST
POST /my_index2/_doc{"name":"写入文档"}POST /my_index2/_doc{"age":"100"}
批量写入数据
格式:
{"index":{"_index":"home","_type":"home",""_id":"2"}}
{"id": 2, "location": "四川省成都市九眼桥", "money": 3000, "area":80, "type": "三居室", "style": "整租"}
第一行指定请求与索引和类型,可以选择的请求有"create","index","delete","ubdate",
"_index"指定索引名,"_type"指定类型名,"_id"指定id
第二行指定插入的内容.
POST /book3/_bulk{"index": {"_id": 1}}{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}{"index": {"_id": 2}}{"name": "Robinson Crusoe", "author": "Daniel Defoe", "date": "2018-01-02"}{"index": {"_id": 3}}{"name": "Pride and Prejudice", "author": "Jane Austen", "date": "2018-01-01"}{"index": {"_id": 4}}{"name": "Jane Eyre", "author": "Charlotte Bronte", "date": "2018-01-02"}
删除文档
删除索引
DELETE /my_index2
根据_id 删除文档
DELETE /my_index2/_doc/TsS6vXMBTHFwbdMQSSps
更新文档
POST针对指定_id文档的字段数据更新,如果对应文档有此字段则执行update 操作,如果此文档没有此字段,则自行增加一个字段并且推断出其数据类型
POST /my_index2/_update/ncTAvXMBTHFwbdMQQCpv{"doc":{"age":10}}
增加一个字段
POST /my_index2/_update/ncTAvXMBTHFwbdMQQCpv{"doc":{"weight":18}}
PUT 针对指定_id 文档下所有字段覆盖
//PUT 操作后
查询文档
hits 是指search 操作执行后所有满足条件的文档个数
ES 查询一般有两种风格普通查询(URI Ssearch)和DSL(特定领域的查询语言),DSL 是通过json 格式的数据组织查询条件,这种方式更加灵活。
ES 的查询分为查询( query )和过滤( filter )
查询(query)会计算每个满足条件的文档的相关度得分,并且根据得分排序
过滤(filter)只会筛选出满足条件的数据,并不会计算得分,而且会对计算结果进行缓存,但从性能上来说效率会更高。
应用过程中,一般是先过滤缩小查询范围,然后查询匹配数据
match、bool、filter、term 匹配区别
bool 查询包含4中操作符 must、must_not、should、filter
must: 必须匹配,与and等价。贡献算分
must_not:必须不匹配,与not等价,常过滤子句用,但不贡献算分
should: 选择性匹配,至少满足一条,与 OR 等价。贡献算分
filter: 过滤子句,必须匹配,不会对结果进行缓存,但不贡献算分,效率较快
嵌套结构查询
term 表示完全匹配,即查询的对象不需要通过分词器解析,文档中通过分词器解析的词组必须和此查询对象完全比配
字段有多个值时,使用terms
match 查询的时候,ES 会将给定的查询对象解析成词组,然后利用这些词组搜索文档,获取文档信息,并且计算相关度得分。
按照条件聚合查询
多条件查询
GET ecommerce/_search{"size": 1,"query": {"match_phrase": {"content": "zhonghua yagao"}},"aggs": {"group_by_tags": {"terms": {"field":"name"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}}select minute,count(*) from ad_optimize_minute_pv group by minuteGET ad_optimize_minute_pv/_search{"size": 1,"aggs": {"sss": {"terms": {"field": "minute.key"}}}}
其他操作
查看映射(所有字段)
GET /test_index/_mapping
查看单个字段映射
GET /test_index/_mapping/field/date
查看文本被分词器解析后的词组
GET /_analyze
{
"analyzer": "standard", #指定分词器
"text":"刘德华是个娱乐圈劳模"
}
//针对index 添加一个字段
PUT /test_index5/_mapping{"properties": {"addr":{"type": "keyword"}}}