查询样例
{"query": { //1
"bool": { ///2
"must": [{ //3
"query_string": {
"default_field": "xxxz",
"query": " *XXX* "
}
}],
"should": [], //4
"must_not": [], 5
"filter": [{ //6
"range": {
"l_last_ts": {
"gte": 1579086000000,
"lt": 1579172400000
}
}
}, {
"term": {
"xxx": "123456"
}
}, {
"term": {
"xxx": "1234567"
}
}, {
"exists": {
"field": "xx"
}
}]
}
}
}
这条语句代表这利用Kibana从ES中查询,查询条件以 query标签开始,以bool查询形式插入条件,其中可以插入条件
must , must_not , should , should_not , filter等,must , must_not , should , should_not , 这些是查询条件是以单独一条的形式存在的,就是说,如果使用,must,则must这个语句块总只放一个单独的条件,在filter中,这个语句块中可以放多个条件,如 range ,
term , exists等,range 表示用来查询时间区间内的数据,一个term相当于一个条件查询,多个term 则是相当于 条件 and 条件
exists则是代表,ES索引中必须存在这个key。
上述语句相当于下列 java 代码:
QueryBuilder queryBuilder = QueryBuilders.boolQuery().
filter(QueryBuilders.rangeQuery(EsQueryConstant.L_LAST_TS).gte(1579086000000).lt(1579172400000)).
filter(QueryBuilders.termQuery("xxx", 123456)).
filter(QueryBuilders.termQuery("xxx", "1234567")).
filter(QueryBuilders.existQuery("xx")).
must(QueryBuilders.stringQuery("xxxz", "*" + "XXX" + "*"));
ES的查询语句必须满足JSON格式,查询语法DSL:
上述查询示例中,1是最外层必须格式,2代表着bool中的查询语句遵循着ES中的相似度评分查询规则,3代表着必须遵循的查询条件,这里还可以是mustnot,should,shouldnot,filter等,这里是非必须条件,可以不写bool,直接上条件,但必须遵循ES查询规则,3中可以包含多种条件,诸如match,multi_match等,3中也可以直接写term等条件(在老版本的ES中支持,新版本的ES中已经不支持这样的查询规则了),6表示着筛选条件,可以在其中设置筛选规则,其中可以包含term,range,exists,type等规则
term:精准字段匹配,如果在ES索引模板中未设置字段类型为.keyword的情况下直接使用这个进行字段查询,则可能出现匹配不到的情况,或者是匹配上多个相似的值,在设置了模板的情况下直接查询,就是进行精准字段查询
range:范围查询,和关系型数据库的 >=,<=一个意义
exist:判断文档是否存在这个key
type: 筛选与所提供的文档/映射类型匹配的文档。
其余的如 agg 等内容,下次再写吧