引言
DSL,叫“特定领域语言”,是针对某一领域,具有受限表达性的一种计算机程序设计语言。elasticsearch的 query DSL即是针对elasticsearch检索的一种特定语言。
es的DSL在使用java API访问es时候也特别好用,本文我们详细了解下es的DSL java API的使用。
在使用java api检索es时候,我们使用的方式是:
QueryBuilder builders = null;// 重点讲这个的构造
SearchResponse response = client.prepareSearch(index)
.setFrom(0).setSize(100)
.setTimeout(TimeValue.timeValueMillis(300))
.setFetchSource(retFields, null)
.setQuery(builders)
.setTypes(type)
.execute().actionGet();
上面查询API中的setQuery就是指定查询的DSL,也是本文主要讲的。
es版本:5.1.x
query和filter
我们知道,es的查询分为两种query和filter,两种不同的上下文环境用于不同的目的。
query
使用上下文
query字句解决的问题是“文档和查询字句匹配程度”,并通过一个score分数来具体表示匹配程度。
query子句查询生效条件
直接在search API中指定query参数(通过setQuery),比如设置如下:
SearchRequestBuilder requestBuilder = client.prepareSearch(index);
requestBuilder.setQuery(QueryBuilders.termQuery("val", "field")); // 指定query,使用的是query上下文
System.out.println(requestBuilder.toString()); // 打印查询语句
SearchResponse response = requestBuilder.execute().actionGet(); // 执行query
在上例中,我们通过设置query参数,使用的就是query上下文查询。如果通过toString方法打印出来,如下:
"query" : {
"term" : {
"field" : {
"value" : "val",
"boost" : 1.0
}
}
}
filter
使用上下文
filter字句解决的问题是“文档和查询字句是否匹配”,只有两种情况YES和NO,不会计算分数。filter字句常用来过滤结构型数据,比如:
- 是否时间字段timestamp处于2015和2016之间
- 是否status字段被设置为true
另外,filter查询会被es缓存到内存以提高性能。
filter字句查询生效条件
触发filter上下文有三种情况:
- 在bool查询中指定filter参数或者must_not参数;
- 在 constant_score查询中指定filter参数;
- filter aggregation,即filter聚合查询;
示例
如下一段查询语句:
GET /_search
{
"query": { (1)
"bool": { (2)
"must": [
{ "ma