一. 前期准备
- 将之前的索引删掉
- 创建一个新的 student 索引
- 创建一个映射关系
多添加了
- 添加数据
POST http://localhost:9200/student/_doc/1
{
"name": "岳泽霖",
"nickname": "小泽霖",
"sex": "男",
"age":28
}
POST http://localhost:9200/student/_doc/2
{
"name": "岳建立",
"nickname": "小建立",
"sex": "男",
"age":26
}
POST http://localhost:9200/student/_doc/3
{
"name": "张三",
"nickname": "张三",
"sex": "男",
"age":24
}
POST http://localhost:9200/student/_doc/4
{
"name": "李四",
"nickname": "李四",
"sex": "女",
"age":24
}
POST http://localhost:9200/student/_doc/5
{
"name": "王二",
"nickname": "王二",
"sex": "女",
"age":16
}
二. 查询
二.一 查询全部文档
{
"query":{
"match_all":{}
}
}
类似于 数据库中的 where 1=1
字段 |
含义 |
took |
查询花费时间,单位毫秒 |
timed_out |
是否超时 false 为不超时 |
_shards |
分片信息 |
_shards.total |
总的分片数 |
_shards.successful |
成功的分片信息 |
_shards.skipped |
忽略的分片信息 |
_shards.failed |
失败的分片信息 |
hits |
搜索命中结果 |
hits.total.value |
搜索条件匹配的文档总数 |
hits.total.relation |
计数规则 eq 表示计数准确, gte 表示计数不准确 |
max_score |
匹配度分值 |
hits |
命中结果集合 |
二.一 匹配查询
{
"query":{
"match":{
"name":"岳泽霖"
}
}
}
会将 岳泽霖 进行拆分, 拆分成 姓 “岳” “泽” “霖”
类似于 name like ‘%岳%’ or name like ‘%泽%’ or name like ‘%霖%’
如果只传入泽霖, 泽霖可以拆分, 会 name like ‘%泽%’ or name like ‘%霖%’
可以验证一下, 只传入一个 霖
二.三 一个值匹配多个字段
{
"query":{
"multi_match":{
"query":"小",
"fields":["name","nickname"]
}
}
}
类似于: name 可以 query ‘小’, nickname 也可以 query ‘小’
二.四 关键字精确查询
term 查询, 精确的关键词匹配查询, 不会对查询的条件进行分词. 传入什么,就是什么.
如果传入 泽霖的话 , 数据存储时, 已经将 岳泽霖 拆分成3段了, 岳, 泽,霖, 所以传入 泽霖 是查询不出来的。
{
"query":{
"term":{
"name":{
"value":"泽霖"
}
}
}
}
类似于 name =“泽霖”
如果只传入 霖的话, 是可以查询出来的。
三.五 多字段精确查找
与 term 查询一样,也不可以将查询条件拆分, 但它允许指定多值进行匹配
{
"query":{
"terms":{
"name":["泽","岳"]
}
}
}
类似 于 name in (‘泽’,‘岳’)
二.六 指定查询字段
默认会将 _score 中的所有的字段都返回, 如果我们只想获取其中的部分字段, 可以使用 _source 过滤
{
"_source":["name","nickname"],
"query":{
"terms":{
"name":["岳","泽"]
}
}
}
类似于 select name ,nickname 之前是 select *
二.七 过滤字段
可以使用 includes 和 excludes 来 进行控制
includes 表示 想要显示的字段, excludes 表示不想要显示的字段
二.七.一 includes 显示字段
{
"_source":{
"includes":["name","nickname"]
},
"query":{
"terms":{
"name":["岳","泽"]
}
}
}
二.七.二 excludes 不显示字段
{
"_source":{
"excludes":["name","nickname"]
},
"query":{
"terms":{
"name":["岳","霖"]
}
}
}
不显示 name 和 nickname
二.八 组合查询
使用 bool, 把各种其它查询通过 must (必须) must_not ( 必须不) should ( 应该) 的方式进行组合。
类似于多个条件的 and 合并 。 must 可以理解为 = must_not 为 != should 该条件不处理
如查询 性别必须是男, 年龄不为 26, 姓名可以为 岳的
{
"_source":["name","nickname"],
"query":{
"bool":{
"must":[
{
"match":{
"sex":"男"
}
}
],
"must_not":[
{
"match":{
"age":"26"
}
}
],
"should":[
{
"match":{
"name":"岳"
}
}
]
}
}
}
类似于 : sex =‘男’ and age !=26
二.九 范围查询
range 查询找到那些落在指定区间内的数字或者时间。 支持 数字和日期
range 允许的字符
操作符 |
说明 |
gt |
> |
gte |
>= |
lt |
< |
lte |
<= |
查询一下, 年龄在 25 到 30 之间
{
"_source":["name","nickname"],
"query":{
"range":{
"age":{
"gte":25,
"lte":30
}
}
}
}
类似于: age between 25 and 30
二.十 模糊查询
返回包含与搜索字词相似的字词的文档。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数. 这些更改可以包括:
- 更改字符(box → fox)
- 删除字符(black → lack)
- 插入字符(sic → sick)
- 转置两个相邻字符(act → cat)
为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体 或扩展。然后查询返回每个扩展的完全匹配。
通过 fuzziness 修改编辑距离。一般使用默认值AUTO,根据术语的长度生成编辑距离
{
"query":{
"fuzzy":{
"name":{
"value":"霖"
}
}
}
}
添加 fuzziness 为2
{
"query":{
"fuzzy":{
"name":{
"value":"霖",
"fuzziness": 2
}
}
}
}
会将数据 都可以出来
二.十一 排序
sort 可以让我们按照不同的字段进行排序, 并且通过 order 指定排序的方式。 asc 为升序, desc 为 降序
二.十一.一 单字段排序
{
"_source":["name","nickname"],
"query":{
"fuzzy":{
"name":{
"value":"岳"
}
}
},
"sort":[
{
"age":{
"order":"desc"
}
}
]
}
类似于 order by age desc
二.十一.二 多字段排序
可以将 _score 和 age 进行排序, _score 为结果的匹配度, 先按照匹配度降序排,再按照年龄升序排.
{
"query":{
"fuzzy":{
"name":{
"value":"霖",
"fuzziness": 2
}
}
},
"sort":[
{
"_score":{
"order":"desc"
}
},
{
"age":{
"order":"asc"
}
}
]
}
类似于 _score desc , age asc
二.十二 高亮查询
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用match 查询的同时,加上一个 highlight 属性:
- pre_tags:前置标签
- post_tags:后置标签
- fields:需要高亮的字段
- title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空
{
"query":{
"match":{
"name":"岳"
}
},
"sort":[
{
"_score":{
"order":"desc"
}
},
{
"age":{
"order":"asc"
}
}
],
"highlight":{
"pre_tags":"<font color='red'>",
"post_tags":"</font>",
"fields":{
"name":{}
}
}
}
高亮一下 岳 进行查询
二.十三 分页查询
使用 from ,size 进行处理
from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
size:每页显示多少条
{
"query":{
"match_all":{}
},
"from":1,
"size":2
}
类似于 limit 1, 2
关于聚合查询,老蝴蝶放置在下一章节进行演示
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!