Elasticsearch笔记
创建索引
PUT /lib/
{
"settings":{
"index":{
"number_of_shards":3,
"number_of_replicas":0
},
"mappings":{
"books":{
"properties":{
"title":{"type":"text"},
"name":{"type":"text","analyzer":"standard"},
"publish_date":{"type":"date","index":false}
}
}
}
}
}
查看索引配置
GET /lib/_settings 查看索引lib的配置
GET _all_settings 查看所有索引的配置
新增doc
put /lib/user/1 put方式需要指定id
{
"first_name":"jane",
"last_name":"smith"
}
POST /lib/user/ POST方式可不需要指定id,id由es生成。(这有点像restful风格,put是修改,哪有修改不需要指定id的呢)
{
"first_name":"tonny",
"last_name":"swing"
}
查询
GET /lib/user/1 通过id查询
GET /lib/user/1?_source=first_name,last_name 只查看特定字段
GET _search GET /lib/_search 查所有
GET /lib/user/_search?q=last_name:tonny&sort=age:desc 条件查询(条件是模糊查询即分词)并排序
GET /lib/user/_search term,terms查找
{
"query":{
"term":{"name":"zhaoliu"}
},
"_source":{
"includes":"ad*",
"excludes":""
},
"sort":[
{
"age":{
"order":"desc"
}
}
]
}
GET /lib/user/_search
{
"query":{
"terms":{
"interests":["zhaoliu","change"]
}
}
}
GET /lib/user/_search
{
"from":0, 分页
"size":2,
"version":true, 是否返回版本号
"query":{
"terms":{
"interests":["zhaoliu","change"]
}
}
}
GET /lib/user/_search match查询,会对指定的match条件进行分词
{
"query":{
"match":{
"name":"zhaoliu zhangsan" 这两个人都会被查出来
}
}
}
GET /lib/user/_search 查询所有文档
{
"query":{
"match_all":{}
}
}
GET /lib/user/_search 多条件分词查找
{
"query":{
"multi_match":{
"query":"changge",
"fields":["interests","name"]
}
}
}
GET /lib/user/_search 短语匹配,值相同,顺序相同才能被查出来
{
"query":{
"match_phrase":{ 短语匹配,值相同,顺序相同才能被查出来
"interests":"changge,ceshl",
},
"match_phrase_prefix":{ 前缀匹配
"interests":"ceshl",
},
"range":{ 范围查找
"birthday":{
"from":"1990-10-10",
"to":"2018-05-01",
"include_lower":true,
"include_upper":true
}
}
"wildcard":{ 通配符查找
"name":"li?i"
},
"fuzzy":{ 模糊查询 这个能查到 name=zhaoliu
"name":"zholiu"
},
"bool":{ 过滤查询,效率比match快
"filter":[
{"term":{"itemID":"ID23123"}} 分词ID会被转换成小写,需改成小写才能查到
],
"should":[ 满足其中一个
{"term":{"termID":""}},
{"term":{"termID":""}}
],
"must":[ 同时满足
{"term":{"termID":""}},
{"term":{"termID":""}}
],
"should":[ 嵌套条件
{"term":{"termID":""}},
{"bool":{
"must":[
{"term":{"termID":""}},
{"term":{"termID":""}}
]}
}
],
"filter":{
"range":{ 范围过滤:gt; >,lt;<,gte;>=,lte;<=
"price":{
"gt":25,
"lt":50
}
},
"exists":{ 非空查找
"field":"price"
}
}
}
},
"highlight":{ 指定返回值高亮(返回值会被<em>标签包裹)
"fields":{
"interests":{}
}
},
}
#聚合查询 max,min,sum,avg,cardinality(基数值即不相同的个数),terms(分组)
GET /lib/user/_search
{
"size":0, 每条记录都会插出来,如果不关心则设置为0
"aggs":{
"price_of_max":{ 自定义名称,
"max":{
"field":"price" 聚合计算的字段
}
},
"price_of_max":{
"min":{ 最小值
"field":"price"
}
}
}
}
示例:对那些有唱歌兴趣的用户按年龄分组,并求每组的平均年龄,并按平均年龄排序
GET /lib/user/_search
{
"size":0,
"query":{
"mathc":{
"interests":"changge"
}
},
"aggs":{
"age_of_group":{
"terms":{
"field":"age",
"order":{
"age_of_avg":"desc" #这个值来自下面
}
},
"aggs":{
"age_of_avg":{
"avg":{
"field":"age"
}
}
}
}
}
}
#复合查询
1.bool查询:should,must,must_not,filter
2.constant_score(不去计算分数,优化查询速度)
修改-更新
put /lib/user/1 put方式需要指定id(覆盖的方式)
{
"first_name":"jane",
"last_name":"smith"
}
POST /lib/uer/1/_update 修改指定字段
{
"doc":{
"age":30
}
}
删除
DELETE /lib/user/1 通过id删除文档
DELETE lib 删除索引
批量操作(multi get api)
GET /_mget
{
"docs":[
{
"_index":"lib",
"_type":"user",
"_id":1,
"_source":"last_name"
},{
"_index":"lib",
"_type":"user",
"_id":2
},{
"_index":"lib",
"_type":"other",
"_id":3
}
]
}
简化
GET /lib/user/_mget
{
"docs":[
{
"_id":1
},
{
"_id":2,
"_type":user
}
]
}
GET /lib/user/_mget
{
"ids":["1","2"]
}
版本控制
put /lib/user/1?version=2 版本(内部版本控制)
{
"first_name":"jane",
"last_name":"smith"
}
put /lib/user/1?version=2&version_type=external 版本(外部版本控制,如时间戳,版本大于内部版本才可执行)
{
"first_name":"jane",
"last_name":"smith"
}
mapping (确定数据类型)
查看maping
GET /lib/user/_mapping
数据类型:
------------------基础数据类型-----------------------
字符型:text,keyword (string)
text会进行分词,keyword不会分词
数字型:long,integer,short,byte,double,float
日期型:date
布尔型:boolean
二进制型:binary
------------------复杂数据类型-----------------------
数组类型:Array datatype,数组类型不需要专门指定数组元素的type,eg:
字符型数组:["one","two"]
整型数组:[1,2]
其他如对象数组等
对象类型(Object datatype):_Object_ 用于单个json对象
嵌套类型(Nested datatype):_nested_用于json数组
------------------地理位置类型-----------------------
地理坐标类型(Geo-point datatype):_geo_point_ 用于经纬度坐标
地理形状类型(Geo-Shape datatype):_geo_shape_ 用于类似多边形的复杂形状
------------------特定类型-----------------------
IPv4:_ip_ 用于IPv4地址
Completion类型:_completion_ 提供自动补全建议
TOken count:_token_count_用于统计做了标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
相关属性:
store :
•index,:true 〃分词,不分词: false.设苗成false,宇段将不約E汞弓l
"analyzer":ik
"boosf:1.23
"doc_values":false
"fielddata":{"format":"disabled"}
"fields-:rraW:rtype_:,stringVinde)C:-not_analyzed]} /河 以 字 段 理 供 多 种 素 引 橫 式 , 同 一 ^ 宇 段 的 但, 一个分词,一^不分词
"ignore_above":100
"include_in_all":ture
"index_options?docs7/4个可选梦数docs (S引文档引,freqs (文括号+词節,positions (文挡号+3频+位里,通常用丰拒离音®), offsets (文档
号+词_+位舌+偏移里,通常被使用茌高??宇段〉分词字段软认^position,其他的软认Sdo«
•11011115,:{>阳1316":111^._丨03戊叩*:_丨3吖*}〃分词字段馱认随.不分词宇段:软认{_6阳1)丨6-负15的,厗«长霣因子和索引时1>0〇51.途议对需要参与坪分宇段
使用,会坂外13加内存消耗里
_nun_va丨ue’:'NULL_〃iS舌一^»失字段的财纽七值,只有string可以使用,分词字段的null值也会被分词
"position_inaeament_gap":0
相关概念
1.乐观锁( Optimistic Locking )(版本号控制数据有效性) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
相关度分数计算
算法:TF/IDF(term frequency&Inverse Document Frequency)词条出现的频率
_explain用法
scroll滚动基数实现大数据量搜索 --提高性能
第一次查询 es创建#快照
GET /lib/user/_search?scroll=1m 1m表示这一批在1分钟内查询出来
{
"query":{
"match_all":{}
},
"sort":["_doc"], 取消按相关度分数排序可避免相关度分数计算,从而提高效率
"size":3 这批查询3个
}
第二次查询
GET /_search/scroll
{
"scroll":"1m",
"scroll_id":""
}