官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
1.1. 简介
Elasticsearch的JAVA API运行在9300端口上,而通过9200端口则可以与它的RESTful API进行通信,它提供了许多API,如文档API、搜索API、索引API、集群API、状态查询API等。
Elasticsearch很多场景下会被当作一个NoSQL的文档型数据库使用,它同样支持增删查改。(因对性能影响较大,查询删除现在需要额外插件支持)。在我们的使用场景下,增加和查询及状态查看等多数情况下都由Logstash、Kibana和Heap、KOPF插件完成。而作为一个日志分析系统,我们最常用到的就是搜索API了,下面简单介绍一下搜索API。
1.2. 搜索API 与 查询DSL
1.2.1.请求格式
向 Elasticsearch 发出的请求和其他所有的 HTTP 请求的组成部分是一致的。例如,计算集群中文件的数量,我们就可以使用:
curl -XGET 'http://localhost:9200/_count'
Elasticsearch会返回一个HTTP头和一个如下格式的JSON
{ "count": 900416, "_shards": { "total": 55, "successful": 55, "failed": 0 } }
其中count即为命中条件的doc计数,_shard则是被查询分片的状态。
Elasticsearch所支持的更完整的请求格式如下:
http://主机名:端口/索引名/type段/id段/方法
要查询到单个doc,es需要索引名,type名,和ID。
l 在Logstash导入数据的时候,如把索引名分成了几种,如apache-*、syslog-*;
索引名支持通配符、多索引、减法
索引名还支持日期运算,如下,可以查询一天前的日志量
curl -XGET 'http://192.168.1.1:9200/<apache-\{now%2Fd-1d\}>/_count?pretty'
加个pretty将使返回内容可读性提高(格式化)。
type名不支持通配符但同样支持多个type如/apache,syslog/
ID名默认自增。
1.2.2.搜索方法
_count方法用于计算命中条件的docs数量
_search 用于查询命中条件的文档
还有很多其他方法可以查看官方文档
Elasticsearch支持以JSON格式的请求体的方式进行搜索,也支持以URI的方式进行简单搜索。在同时使用二者时,会先以URI的条件返回。
1.2.2.1. URI搜索
fields=字段名, 可以指定返回字段。如:/apache-2016.08.18/_search?fields=loglevel,host
q=fields:word 搜索条件
from=0 从搜索结果的第几条开始返回
size 返回数量
P.S.:URI以?开头,之间以&连接
例:/apache-*/slave1/_search?q=_all:404&size=100
更多用法请查看:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
1.2.2.2. 请求体搜索
1.2.2.2.1. 请求体的写法
{ "query": { "bool": { "must": [ { "match_all": {}}, ], "must_not": [], "should": [], "filter": [ { "term": { "host": "master" }}, { "range": { "@timestamp": { "gte": "2016-08-07" }}} ] "sort" : [] } }, "from": 0, "size": 1000, }
如上,是一个典型的请求体写法,除了查询,还能做一些例如统计、排序之类的工作。除了query外,还有很多其他功能我们可以用到
from/size : 值为数字,from为自命中的第几条结果开始返回,size表示返回多少条结果
sort : 可以指定排序的field。
_source : 可以设置为true或者false,指定是否返回source字段内容,默认为true,还可以使用通配符,指定范围source里的哪些字段。
aggs : 汇总统计查询返回内容里某字段里各个值出现的次数。
highlight : 将特定内容加高亮。
1.2.2.3. 查询DSL
Elasticesearch有自己的Query DSL,提供了非常丰富的搜索方式。无法一一道尽,感兴趣的小伙伴可以浏览:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
这一章,查看详细用法。下面简单介绍一下常用的一些API
1.2.2.3.1. 全文查询
l 匹配查询
{ "match" : { "message" : "this is a test" } }
l 多项匹配查询
{ "multi_match" : { "query": "this is a test", "fields": [ "subject", "message" ] #多个字段内匹配 } }
1.2.2.3.2. 项级别查询
l 单项查询
{ "term" : { "fields" : "word" } }
项查询和匹配查询是略有区别的,具体戳
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
l 多项查询
{ "terms" : { "field" : ["word1", "word2"]} }
l 范围查询
对num值的查询
{ "range" : { "age" : { "gte" : 10, "lte" : 20, "boost" : 2.0 } } }
对时间范围的查询如下
{ "range" : { "date" : { "gte" : "now-1d/d", "lt" : "now/d" } } }
带格式的时间范围查询
{ "range" : { "born" : { "gte": "01/01/2012", "lte": "2013", "format": "dd/MM/yyyy||yyyy" } } }
l 存在查询
返回字段存在值的文档
{ "exists" : { "field" : "user" } }
l 通配符查询
可以使用*或者?匹配多个或单个字符
{ "wildcard" : { "user" : "ki*y" } }
l 正则表达式查询
{ "regexp":{ "name.first": { "value": "s.*y", "flags" : "INTERSECTION|COMPLEMENT|EMPTY", "max_determinized_states": 20000 } } }
l 模糊查询
{ "fuzzy" : { "price" : { "value" : 12, "fuzziness" : 2 #模糊范围 } } }
l 类型查询
{ "type" : { "value" : "my_type" } }
l ID查询
{ "ids" : { "type" : "my_type", "values" : ["1", "4", "100"] } }
1.2.2.3.3. 混合查询
l 布尔查询
"bool": { "must”: {}, "filter": {}, "must_not" : {}, "should" : [] }
1.2.2.3.4. 专用查询
l 近似查询
{ "more_like_this" : { "fields" : ["title", "description"], "like" : [ { "_index" : "imdb", "_type" : "movies", "_id" : "1" }, { "_index" : "imdb", "_type" : "movies", "_id" : "2" }, "and potentially some more text here as well" ], "min_term_freq" : 1, "max_query_terms" : 12 } }