ElasticSearch回顾2-这也能增删改查?

it2024-07-06  45

ElasticSearch回顾2-这也能增删改查?

我们知道ES是一个搜索引擎,但其实他也能做到实时存储,甚至当一个数据库用

增删改查

又到了大家喜闻乐见的CRUD环节

我们先看看创建

PUT

先插个三条数据康康

PUT /feng666/user/1 { "name": "冯半仙", "age": 18, "desc": "就这就这?不会还有人0offer吧", "tags":["菜","穷","丑"] } PUT /feng666/user/2 { "name": "冯大仙", "age": 22, "desc": "哦原来是我自己啊", "tags":["很菜","很穷","也不帅"] } PUT /feng666/user/3 { "name": "马云", "age": 55, "desc": "还不来修福报啊", "tags":["996","福报","奋斗"] }

查看数据

注:

执行命令时,若数据不存在,则新增该条数据,如果存在则修改这条数据

GET

我们可以用GET查询,获得数据

如果想修改,则put直接覆盖

PUT /feng666/user/1 { "name": "冯半仙", "age": 18, "desc": "就这就这?不会还有人0offer吧", "tags":["不菜","不算穷","不算太丑"] }

如果更改一部分,还得把之前的全部写一遍,也太麻烦了,这不合理。

那我们可以试一下post来更新数据

POST

我们使用 POST 命令,在 id 后面跟 _update ,要修改的内容放到 doc 文档(属性)中即可。

POST /feng666/user/1 { "doc":{ "name": "冯半仙666", "desc":"别骂了别骂了" } }

运行结果

查询

刚才就知道了,查询用GET就完事儿了

比如查第一条数据,

GET /feng666/user/1

那如果条件查询呢?把字段加入 _search?q=

GET /feng666/user/_search?q=name:冯半仙666 GET /feng666/user/_search?q=name:马云

通过 _serarch?q=name:冯半仙666 查询条件是name属性有冯半仙666的那些数据。

我们查冯半仙666的时候,发现两个结果都返回了

并且返回值里面有个hits,还有一个_score,得分,分越高表示查询条件匹配度越高

也可以自己构建查询条件

构建查询

GET feng666/user/_search { "query":{ "match":{ "name": "冯半仙" } } }

返回结果

我们也可以查询全部,怎么查呢?

GET feng666/user/_search { "query":{ "match_all": {} } }

可以发现查出了所有的数据,这里查询不构建条件

就像select * from table_name一样

如果只要select 某个属性 from table_name呢?

继续构建

GET feng666/user/_search { "query":{ "match_all": {} }, "_source": ["name","desc"] }

可以发现返回了指定结果

查询结果排序

咱mysql里有order by desc ,那es里呢?一样一样的

构建

GET feng666/user/_search { "query":{ "match_all": {} }, "sort":[ { "age":{ "order": "desc" } } ] }

使用desc和asc分别测试

分页查询

GET feng666/user/_search { "query":{ "match_all": {} }, "sort":[ { "age":{ "order": "asc" } } ], "from": 0, "size": 1 }

布尔查询

我们添加一个name也叫冯半仙666的数据,但其他属性不相同

PUT /feng666/user/4 { "name": "冯半仙666", "age": 28, "desc": "年纪大了,不能加班了", "tags":["头发呢","身体不行了","眼圈重"] }

我们用must查询name是冯半仙666的,但年龄是18岁的

must(and)

查询结果

有点像select * from user where name = “冯半仙” and age = 18的意思

那如果是或条件呢?

should(or)

查询name是冯半仙666或者年龄是18的

GET feng666/user/_search { "query":{ "bool": { "should": [ { "match": { "name": "冯半仙666" } }, { "match": { "age": "18" } } ] } } }

查询结果

那查询年龄不是18的呢

must_not(not)

GET feng666/user/_search { "query":{ "bool": { "must_not": [ { "match": { "age": "18" } } ] } } }

查询结果

Fitter

查询指定name,age大于18的数据

GET feng666/user/_search { "query":{ "bool": { "must": [ { "match": { "name": "冯半仙666" } } ], "filter":{ "range":{ "age":{ "gt":18 } } } } } }

gt是大于的写法我们在java里早就接触过了

类似的还有

gt 表示大于

gte 表示大于等于

lt 表示小于

lte 表示小于等于

如果是查询25-30岁之间,

GET feng666/user/_search { "query":{ "bool": { "must": [ { "match": { "name": "冯半仙666" } } ], "filter":{ "range":{ "age":{ "gt":25 , "lt": 30 } } } } } }

可以发现只返回了一个符合的结果

term精确查询

term查询直接通过倒排索引指定的词条查询的

分词:term直接查询精确的match:会使用分词器解析,先分析文档

注意:

我们用的ES7版本中,mappings properties去给多个字段(fields)指定类型的时候,不能给我们的索引指定类型

PUT test2 { "mappings":{ "properties":{ "name":{ "type": "text" }, "desc": { "type": "keyword" } } } } //插入数据 PUT test2/_doc/1 { "name": "冯半仙Java name", "desc": "冯半仙Java desc" } PUT test2/_doc/2 { "name": "冯半仙Java name", "desc": "冯半仙Java desc2" }

在上面的test2索引中,字段name被查询时会被分析器进行分析后匹配查询。但keyword类型不会被分析器处理

测试可得

GET _analyze { "analyzer": "keyword", "text": "冯半仙Java name" }

运行

可以发现这里简单的字符串,并未被分析,如果改成name属性

GET _analyze { "analyzer": "standard", "text": "冯半仙Java name" }

运行

总结:keyword不会被分析器分析

GET test2/_search // text 会被分析器分析查询 { "query": { "term": { "name": "冯" } } } GET test2/_search // keyword 不会被分析所以直接查询 { "query": { "match": { "desc": "冯半仙Java desc" } } }

两个类型:text keyword —>>> text类型可以被分词器解析,keyword类型不会被分词器解析

term和match查询区别

1、match查询

match是经过分析(analyer)的,也就是说,文档是先被分析器处理了,根据不同的分析器,分析出 的结果也会不同,在会根据分词 结果进行匹配。 并且根据lucene的评分机制(TF/IDF)来进行评分。

2、term查询

term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

terms

官网API介绍 https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_multiple_exact_values.html

再插入两个字段

PUT test2/_doc/3 { "t1": "22", "t2": "2020-10-20" } PUT test2/_doc/4 { "t1": "33", "t2": "2020-10-21" }

使用精确查询

GET test2/_search { "query": { "bool": { "should": [ { "term": { "t1": "22" } }, { "term": { "t1": "33" } } ] } } }

除了bool查询之外

GET test2/_doc/_search { "query": { "terms": { "t1": ["22","33"] } } }

高亮显示

我们在搜索的时候,会发现查询结果与关键词一致时,关键词会高亮,这是怎么做到的呢?

ES就内置了高亮结果显示的查询,我们知道,浏览器的高亮其实就是给关键字加了一个标签实现的

GET feng666/user/_search { "query": { "match": { "name": "半仙" } }, "highlight": { "fields": { "name": {} } } }

查询后返回的结果

这是es默认的是em标签,我们也可以自定义高亮标签

GET feng666/user/_search { "query": { "match": { "name": "半仙" } }, "highlight": { "pre_tags": "<b class='key' style='color:red'>", "post_tags": "</b>", "fields": { "name": {} } } }

运行结果

关于ElasticSearch的学习就到这里,其实总结的在全,也没有官网的API全,技术是学不完的,我们主要是为了提升自己的学习能力,比如看官方文档也能去实现个7788,就是进步。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

最新回复(0)