ElasticSearch搜索引擎
复杂花式搜索
文章转载至: 【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂.
ElasticSearch本文下称ES对于大数据高并发时代的数据快速处理的方案,其提供的springBoot接口使用很方便,其专注于查询,分词,高亮,作用相当于数据库,默认存储类型为doc也就是文档
来自Restful访问规则
PUT
添加数据,也可以修改数据,但会造成数据覆盖
// kibanna
PUT /kuangshen/user/1 //访问格式/类型/id
{
"name":"狂神说JAVA",
"age":"23",
"desc":"一顿操作猛如虎,还是我最叼"
"tags":["技术宅","猛男","没对象"]
}
POST
修改数据,version对应修改, 如果词尾没有添加/_update 也会造成数据覆盖
// kibanna
POST /kuangshen/user/1/_update //访问格式/类型/id/_update
{
"age":"25"
}
GET
查询数据,此博客主要关注GET,最简化的为
// kibanna
GET/kuangshen/user/1 //访问格式/类型/id
// kibanna
GET/kuangshen/user/_search?q=name:"狂神" //访问格式/类型/
DELETE
删除数据
// kibanna
DELETE kuangshen //访问格式
属性
_score (成绩)
这个属性为默认的,作为权重使用,分值越高权重越高
_hit
索引和文档的信息,查询的结果总数,数据中的结果都可以遍历出来
构建一个数据库(类比)
// kibanna
PUT testdb //访问格式/类型/id
{
"mappings":{
"properties":{
"name":{
"type":"text" //指定字段类型
},
"desc":{
"type":"keyword" //指定字段类型
}
}
}
}
复杂操作Select(排序、分页、高亮、模糊、精准查询)
模糊查询
name携带输入字符串的都会被查询出来,类似于LIKE
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"name":"狂神"
}
}
}
筛选字段查询
对比起select * from我们更喜欢用select 字段 这时候就需要source
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"name":"狂神"
}
},
"_soure":["name","age"]
}
这样就只会查询name,age之后使用JAVA操作就是操作里面的key
排序
对比 ORDER BY
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"name":"狂神"
}
},
"sort":[
{
"name":{
"order":"desc"
}
}
]
}
分页
类比 limt
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"name":"狂神"
}
},
"from":0,//从第几条开始,数据下标还是从0开始
"size":1//取几条
}
布尔值查询
must
所有条件都要符合 where id= 1 and name = xx
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
}
should
类比 or
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
}
must_not
取反must
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"bool":{
"must_not":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
}
过滤器filter
可以使用filter进行数据过滤
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"bool":{
"must_not":[
{
"match":{
"name":"张三"
}
}
],
"filter":{
"range":{
"age":{
"lt":10
}
}
}
}
}
}
- gt 大于
- gte 大于等于
- lt 小于
- ite 小于等于
在过滤器中可以使用多个进行限制
用空格隔开数据进行多条件模糊查询
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"tags":"男 技术"
}
}
}
}
匹配度越高权重越高,score越高
精确查询!
term查询是直接通过倒排索引指定的词条进程精确查找的!
关于分词:
- term,直接查询精确的
- match,会使用非瓷器进行解析!(线分析文档,然后在通过分析的文档进行查询)
两个类型的key word
// kibanna
GET _analye
{
"analyzeer":"keyword",//这个类型的搜索,不会将下边的字符串分割为"狂" "神"
"text":"狂神说 JAVA"
}
// kibanna
GET _analye
{
"analyzeer":"standard",//这个类型的搜索,会将下边的字符串分割为"狂" "神"
"text":"狂神说 JAVA"
}
term
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"term":{
"name":"狂" //name带狂的
}
}
}
}
keyword类型不会被解析
高亮!
// kibanna
GET/kuangshen/user/_search //访问格式/类型/id
{
"query":{
"match":{
"name":"狂神"
}
},
"highlight":{
"fields":{
"pre_tags":"<p class='key' style='color:red'>",//结果前html
"post_tags":"</p>"//结果后html
"name":{}
}
}
}
}
其实MYSQL可以做但是效率没有这么高