ElasticSearch-query-简单查询
2025-01-22 08:19:30    1.4k 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)


1. elasticsearch 返回体字段含义

字段含义
tookElasticsearch执行搜索的时间(以毫秒为单位)
timed_out告诉我们搜索是否超时
_shards告诉我们搜索了多少个分片,以及搜索成功/失败分片的数量
hits搜索结果
hits.total符合我们搜索条件的文档总数
hits.hits实际的搜索结果数组(默认为前10个文档)
hits.sort对结果进行排序键(如果按分数排序则丢失)

2. 检索文档

要从es中获取文档,同样适用_index、_type、_id进行定位,使用GET方法

1
2
3
GET /demo/testDate/2

GET /demo/testDate/2?pretty

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
{
"_index": "demo",
"_type": "testDate",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"name": "cyx2",
"age": "23",
"address": "nanjing2"
}
}

响应中的节点都熟悉,增加了_source节点,它包含了原始文档。响应消息中包含 {“found”:true},意味着文档已经找到。

如果我们请求一个不存在的文档,依旧会得到一个json,不过found变成了flase。

1
2
3
4
5
6
{
"_index": "demo",
"_type": "testDate",
"_id": "aaaa",
"found": false
}

此外,HTTP状态码变成了"404 Not Found"

curl

pretty的作用

我们使用普通 curl时,返回的json数据格式,没有格式化

pretty-curl

使用pretty可以格式化输出的数据

pretty-curl

查询条件

1
2
3
4
5
6
7
8
get /books/book/_search
{
"query":{
"match": {
"_id": "25"
}
}
}

输出结果

1
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
28
29
30
{
"took" : 28,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "books",
"_type" : "book",
"_id" : "25",
"_score" : 1.0,
"_source" : {
"name" : "普通高等教育“十一五”国家级规划教材辅助用书:经济法习题与案例集",
"publish" : "高等教育出版社",
"type" : "大学教材",
"author" : "曲振涛",
"info" : "《经济法习题与案例集》是普通高等教育“十一五”国家级规划教材(高职高专教育)《经济法》(第三版)的配套习题与案例集。与主教材对应,本习题与案例集共分18章,题型包括名词解释、判断题、单项选择题、多项选择题、填空题、简答题、论述题和案例分析题。",
"price" : 16
}
}
]
}
}

3. 基本匹配查询

在news索引,new类型下,所有字段中,查询带有’新华社’的结果

1
GET /news/new/_search?q=新华社

在news索引,new类型下,所有字段中,查询带有’2018’的结果

1
curl -XGET '127.0.0.1:9200/news/new/_search?q=2018&pretty'

指定字段

1
curl -XGET '127.0.0.1:9200/news/new/_search?q=content:2018&pretty'

指定查询数量

1
curl -XGET '127.0.0.1:9200/books/book/_search?size=2&q=name:2010&pretty'

4. match_all(最简单的查询,匹配所有文档)

查询 books 索引,所有文档

1
2
3
4
5
6
GET /books/_search
{
"query": {
"match_all": {}
}
}

查询 books 索引,book类型下,所有文档

1
2
3
4
5
6
GET /books/book/_search
{
"query": {
"match_all": {}
}
}

5. 检索文档指定字段

在_source参数中,可能感觉兴趣的只有address,指定个别字段可以使用_source参数,多个字段用逗号分割。

1
2
3
GET /demo/testDate/2?_source=address

GET /demo/testDate/1?_source=name,address

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"_index": "demo",
"_type": "testDate",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"address": "nanjing2"
}
}

{
"_index": "demo",
"_type": "testDate",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"address": "nanjing",
"name": "cyx1"
}
}

_source节点中只有我们指定的字段


如果只想得到_source节点下的数据,不想要元数据,可以这样

1
GET demo/testDate/1/_source

响应报文

1
2
3
4
5
{
"name": "cyx1",
"age": "22",
"address": "nanjing"
}

5.1. 检查文档是否存在

对文档内容不感兴趣,只想知道文档是否存在,使用HEAD方法 代替 GET方法。

1
HEAD demo/testDate/1

响应报文

1
200 - OK

如果文档不存在

1
HEAD demo/testDate/t

响应报文

1
404 - Not Found

6. 指定文档返回数量

books索引、book类型下,查询name包含’中国’的文档,限制返回数量为2。

1
2
3
4
5
6
7
8
9
GET /books/book/_search
{
"query": {
"match": {
"name": "中国"
}
},
"size": 2
}

7. Get 和 Search

get API 的形式

1
2
3
4
5
GET twitter/_doc/0

GET <index>/_doc/<_id>

GET <index>/_source/<_id>

search API 的形式

1
2
3
4
5
GET /twitter/_search?q=tag:wow

GET /<index>/_search

POST /<index>/_search

可以看出get API和search API 在形式上的不同。

get api更多的直接通过文档id,直接搜索查询。

search api 则是通过某些查询查询条件,进行搜索查询。

当然了,search api 也可以通过文档id直接搜索查询。

不过需要注意:get API查询,默认是实时的;并且不受索引刷新率的影响(当数据对搜索可见时)。可以通过 realtime 参数进行配置(true-实时 false-禁用实时)。


8. Reference