ElasticSearch使用入门学习笔记
1、保存数据:
方法一:
Put请求必须带id,如果该id原本没有数据,则为新增操作,如果该id原本有数据,则为更新操作。
Url:http://192.168.2.2:9200/索引/类型/id put
方法二:
Post也可以带id,效果与put相同,也可以不带id,则每次都是新增操作,系统会自动给新增的数据分配一个唯一id。
Url:http://192.168.2.2:9200/索引/类型/id post
2、更新数据
方法一:
通过保存数据的方式都可以做数据更新,但每次更新不会进行数据对比,会直接更新,同时版本号"_version":加一,序列号"_seq_no": 加一。
Url:http://192.168.2.2:9200/索引/类型/id put/post
方法二:
通过post请求/_update的方式更新数据,会进行数据对比,如果新旧数据一致,则不会进行更新,版本号"_version"和序列号"_seq_no"都不会发生变化,操作的结果"result"为"noop"。
Url:http://192.168.2.2:9200/索引/类型/id/_updatepost
请求数据格式:
{ "doc":{ "name":"zhanglei", "age":24 } }
3、删除数据
删除单个数据:
Url:http://192.168.2.2:9200/索引/类型/id delete
删除索引:
Url:http://192.168.2.2:9200/索引 delete
没有删除类型的方法,只能删除索引或者清空类型下的所有数据
4、批量操作
通过kibana操作
POST /_bulk {"delete":{"_index":"website","_type":"blog","_id":"123"}}//删除 {"create":{"_index":"website","_type":"blog","_id":"123"}}//新增 {"title":"my first blog post"}//新增的数据 {"index":{"_index":"website","_type":"blog"}}//新增 {"title":"my second blog post"}//新增的数据 {"update":{"_index":"website","_type":"blog","_id":"123"}}//更新 {"doc":{"title":"my updated blog post"}}//更新的数据
ElasticSearch批量操作的各个数据之间相互独立,一条数据的失败并不会影响另一条数据操作的成功,不具有类似数据库操作的事务功能。
更新操作中”_retry_on_conflict”表示更新失败后重复操作的次数,当前版本已废弃该功能,无法再使用。
5、查询检索
1、url形式
GET bank/_search?q=*&sort=account_number:asc
q=*表示查询所有
sort=account_number表示以account_number字段进行排序
asc表示升序排序(desc表示降序排序)
2、请求体形式
GET bank/_search { "query":{ "match_all": {} //表示查询所有 }, "sort":[ //排序方式 { "account_number":"asc" }, { "balance":"desc" } ], "from": 5, //从第几个数据开始查询
"size": 5, //查询多少个数据 "_source":[ "account_number","balance","age"] //返回的_source内容(没有指点的内容将不会返回) }
3、精确检索与全文检索
match:分词匹配
GET bank/_search { "query":{ "match": { //匹配信息 "address":"Elm" //匹配address字段的Elm字符 } } }
全文检索会按照评分进行排序,会对检索条件进行分词匹配。
match_phrase:短语匹配
GET bank/_search { "query":{ "match_phrase": { "address": "elm avenue" } } }
与match不同的是,match_phrase会将匹配内容看做一个整体进行匹配,而不会对匹配内容进行分词。
multi_match:多字段匹配
GET bank/_search { "query": { "multi_match": { "query": "elm Place ", "fields": ["address","city"] } } }
对fields中指定的属性按query指定的字符进行分词匹配。
bool:用于组合多种匹配方式
GET bank/_search { "query": { "bool": { //bool用于组合多种匹配方式 "must": [ //must用于指定必须匹配的内容 { "match": { "gender": "m" } }, { "match": { "address": "mill" } } ], "must_not": [ //must_not用于指定必须排除的匹配内容 {"match": { "age": "28" }} ], "should": [ //should用于指定希望匹配上的内容,匹配上should指定的内容会获得更高的得分,但如果没有匹配上也可以检索出来 {"match": { "lastname": "hines" }} ] } }
term:完全匹配,不会做分词
GET bank/_search { "query": { "term": { "address":"road" } } }
经过测试,发现:
1、term对于值为数字的字段进行匹配是完全没有问题的。
2、term对于单个单词(不含空格)进行匹配也可以,但指定的单个单词不能含有大写字母,这样会匹配到所有该字段值中含有该个单词的数据,大小写字母不影响匹配,但指定单词必须为小写。
3、无法匹配出含有多个单词的字符。
建议:只在非字符字段匹配使用term。
keyword:值精确匹配
GET bank/_search { "query": { "match": { "address.keyword":"263 Aviation Road" } } }
只能匹配到字段值和指定数据完全相同的数据,并且对大小写敏感。
range:进行区间匹配
gte:区间匹配的下界
lte:区间匹配的上界
GET bank/_search { "query": { "bool": { "must": [ { "range": { "age": { //匹配age字段值在18-28之间的所有数据 "gte": 18, "lte": 28 } } } ] } } }
filter:过滤,用法和匹配效果和must相同,但通过filter匹配的条件不会进行相关性得分计算
GET bank/_search { "query": { "bool": { "filter": [ { "range": { "age": { "gte": 18, "lte": 28 } } } ] } } }
aggregations聚合分析
GET bank/_search { "query": { "match": { "address": "mill" //匹配条件 } }, "aggs": { "ageAggs": { "terms": { //分布分析,根据age属性的分布进行分析,size为分页属性 "field": "age", "size": 10 } }, "ageAvg":{ "avg": { //计算age字段的平均值 "field": "age" } }, "balanceAvg":{ "avg": { //计算balance字段的平均值 "field": "balance" } } } , "size": 0 //不显示匹配到的数据,只显示聚合分析信息 }
posted on 2020-12-12 22:46 SilenceAries 阅读(103) 评论(0) 收藏 举报