Elasticsearch 索引文档
Request URL:http://localhost:4567/{index}/_search
字段index
为索引编号
eg:http://localhost:4567/app_access_log-2018.04.06/_search
Request Method: POST
Request Payload
{
"query":{查询体},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
为json
格式,query
为查询字典的key
里面是具体的查询语句,from
为Response返回结果列表在页面显示的开始位置。默认为。size
:返回数据的数量。sort
默认为空列表[]
,aggs
默认为空字典{}
query 查询体字段解释
"query": {
"bool": {
"must": [查询条件],
"must_not": [查询条件],
"should": [查询条件]
}
}
must
列表:填充查询结果里必须包含的query
字段,must_not
列表:填充查询结果里必须不包含的query
字段,should
列表:填充查询结果里可能存在的query
字段。
bool must
语句指明了,对于一个文档,所有的查询都必须为真,这个文档才能够匹配成功。
bool should
语句指明,对于一个文档,查询列表中,只要有一个查询匹配,那么这个文档就被看成是匹配的。
bool must_not
语句指明,对于一个文档,查询列表中的的所有查询都必须都不为真,这个文档才被认为是匹配的。
[]查询条件格式
[{
"query_string": {
"default_field": "message",
"query": "具体关键字"
}
}, {
"range": {
"@timestamp": {
"gt": "2018-04-06T00:00:06.824Z",
"lt": "2018-04-08T00:00:06.824Z"
}
}
}]
字典query_string
内包含查询的内容query
:具体关键字
字典range
内包含时间戳@timestamp
:时间戳的范围可以用gt
,lt
,gte
,lte
来限定大于,小于,大于,等于。具体时间格式为2018-04-06T00:00:06.824Z
这样的格式。
举例查询
Request Payload(不加时间戳限制条件,单条件查询。必须包含查询字段:金融 ;一次返回10条查询记录):
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "message",
"query": "金融"
}
}],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
Request Payload(不加时间戳限制条件,多条件查询。必须包含查询字段:金融 ,一定不包含查询字段:财务;一次返回10条查询记录):
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "message",
"query": "金融"
}
}],
"must_not": [{
"query_string": {
"default_field": "message",
"query": "财务"
}
}],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
Request Payload(不加时间戳限制条件,多条件查询。必须包含查询字段:金融 ,一定不包含查询字段:财务,可能存在字段:发财了;一次返回10条查询记录):
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "message",
"query": "金融"
}
}],
"must_not": [{
"query_string": {
"default_field": "message",
"query": "财务"
}
}],
"should": [{
"query_string": {
"default_field": "message",
"query": "发财了"
}
}]
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
Request Payload(加时间戳限制条件,多条件查询。时间限制:大于 2018-04-06T00:00:06.824Z ,小于等于 2018-04-08T00:00:06.824Z 必须包含查询字段:金融 ,一定不包含查询字段:财务,可能存在字段:发财了;一次返回10条查询记录):
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "message",
"query": "金融"
}
}, {
"range": {
"@timestamp": {
"gt": "2018-04-06T00:00:06.824Z",
"lte": "2018-04-08T00:00:06.824Z"
}
}
}],
"must_not": [{
"query_string": {
"default_field": "message",
"query": "财务"
}
}],
"should": [{
"query_string": {
"default_field": "message",
"query": "发财了"
}
}]
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
Response 响应结果
{
"took": 354,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 60884,
"max_score": 2.1993985,
"hits": [查询的结果]
}
}
对于这个响应,我们看到了以下的部分:
- took —— Elasticsearch执行这个搜索的耗时,以毫秒为单位
- timed_out —— 指明这个搜索是否超时
- _shards —— 指出多少个分片被搜索了,同时也指出了成功/失败的被搜索的shards的数量
- hits —— 搜索结果
- hits.total —— 能够匹配我们查询标准的文档的总数目
- hits.hits —— 真正的搜索结果数据(默认只显示前10个文档)
- _score和max_score —— 现在先忽略这些字段
hits.hits查询结果
{
"_index": "app_log-2018.05.01",
"_type": "app_log",
"_id": "AWMZbfFNkdRKmtq_ckcT",
"_score": 2.1993985,
"_source": {
"@timestamp": "2018-05-01T02:00:25.209Z",
"message": "具体的log信息",
"@version": "1",
"path": "/data/logs-app/all.log",
"host": "localhost",
"type": "app_log",
"tags": ["_grokparsefailure"]
}
}
对于hits.hits查询结果,我们看到了以下的部分:
- _index —— log索引的日志
- _type —— log类型
- _id —— 可忽略
- _score —— 索引结果 接近匹配程度的程度,分值越高,越符合要求
- _source —— 查询到的结果 message中就是我们想要的结果
有一点需要重点理解一下,一旦你取回了你的搜索结果,Elasticsearch就完成了使命,它不会维护任何服务器端的资源或者在你的结果中打开游标。这是和其它类似SQL的平台的一个鲜明的对比, 在那些平台上,你可以在前面先获取你查询结果的一部分,然后如果你想获取结果的剩余部分,你必须继续返回服务端去取,这个过程使用一种有状态的服务器端游标技术。