ES 索引库的查询
# 35.ES 索引库的查询
上一篇讲了怎么维护索引库,接下来讲讲常见的查询操作。
# 添加数据
为了方便后续的演示,我们初始化一些数据:新增几篇文章
请求 URL:POST 127.0.0.1:9200/blog/hello/2
{
"id": 2,
"title": "关于买房",
"content": "虚假的挥霍:花几千块钱去看看海。真正的挥霍:花100万交个首付买一个名义面积70平,实际面积55平,再还30年贷款的小户型住房"
}
2
3
4
5
请求 URL:POST 127.0.0.1:9200/blog/hello/3
{
"id": 3,
"title": "关于梦想",
"content": "编程对我而言,就像是一颗小小的,微弱的希望的种子,我甚至都不愿意让人看见它。生怕有人看见了便要嘲讽它,它太脆弱了,经不起别人的质疑"
}
2
3
4
5
请求 URL:POST 127.0.0.1:9200/blog/hello/4
{
"id": 4,
"title": "关于打工",
"content": "其实,我对公司是有点失望的。当初给我司定位为大厂,是高于公司简介的水平的。我是希望进来后,公司能够拼一把,快速成长起来的。大厂这个层级不是只发工资就可以的,公司需要有体系化的待遇。你们给的待遇,它的价值在哪里? 公司是否作出了壁垒形成了核心竞争力? 公司的待遇,和其他公司的差异化在哪里?为什么我来你这上班,我不能去别人那上班吗? 公司需要听从员工的意见,而不是想做什么就做什么,我需要符合劳动法的公司。"
}
2
3
4
5
删除其他的数据,只保留上述 3 个:
# 查询文档-根据 id 查询
请求 URL:不用请求体
GET localhost:9200/blog/hello/2
响应数据:
{
"_index": "blog",
"_type": "hello",
"_id": "2",
"_version": 3,
"found": true,
"_source": {
"id": 2,
"title": "关于买房",
"content": "虚假的挥霍:花几千块钱去看看海。真正的挥霍:花100万交个首付买一个名义面积70平,实际面积55平,再还30年贷款的小户型住房"
}
}
2
3
4
5
6
7
8
9
10
11
12
# 查询文档-根据关键词查询
请求 URL:
POST localhost:9200/blog/hello/_search
请求体内容:
{
"query":
{
"term":
{
"title": "梦"
}
}
}
2
3
4
5
6
7
8
9
这里我们搜索 title 字段中带有“梦”这个字的数据。注意,目前没有用中文分词器,所以不能搜索汉语词语
搜索结果:可以看到 hits 中,total 是搜索的结果数量,这里是 1;下面就是命中的文档列表。
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "blog",
"_type": "hello",
"_id": "3",
"_score": 0.2876821,
"_source": {
"id": 3,
"title": "关于梦想",
"content": "编程对我而言,就像是一颗小小的,微弱的希望的种子,我甚至都不愿意让人看见它。生怕有人看见了便要嘲讽它,它太脆弱了,经不起别人的质疑"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
读者也可试试查询其他关键词,或搜索 content 中的内容,作为一个小练习。
# 查询文档-根据一句话查询
之前我们学 Lucene 时,讲过 使用 queryparser 查询 (opens new window);ES 当然也支持。请求 URL:
POST localhost:9200/blog/hello/_search
请求体内容:
{
"query":
{
"query_string":
{
"default_field": "title",
"query": "白日梦"
}
}
}
2
3
4
5
6
7
8
9
10
default_field 就是默认搜索域,query 就是要查询的一句话,我们会先对这句话分词,分完词之后再查询
查询结果:可以看到梦这个字是有命中的,因此能查询出来结果
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "blog",
"_type": "hello",
"_id": "3",
"_score": 0.2876821,
"_source": {
"id": 3,
"title": "关于梦想",
"content": "编程对我而言,就像是一颗小小的,微弱的希望的种子,我甚至都不愿意让人看见它。生怕有人看见了便要嘲讽它,它太脆弱了,经不起别人的质疑"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# head 插件查询
其实 head 插件也提供了丰富的查询功能:
首先我们可以指定查询哪个 Index:
然后我们可以指定查询的条件,must 就是必须符合,should 就是可以符合,must_not 就是不能符合,相当于与或非:
可以指定查询的内容:例如查询某个字段,match_all 相当于查询全部字段
还可以指定多个查询条件:
例如我们可以查询,title 中包含梦这个字的内容,然后点击查询:下方就是查询的结果
点击加号,还能创建多个查询的页面(类似浏览器的多选项卡)