参考官网 Elasticsearch Reference [7.10] » Query DSL » Query and filter context
文章目录
1.1、query与filter区别
- 1.1、query与filter区别
- 1.2、实例: 依据smsContent字段包含魅力的以及fee消费小于400的filter查询公司的短信内容
- 1.2.1、RESTful 代码
- 1.2.2、java 代码
query,根据你的查询条件,去计算文档的匹配得到一个分数_score,并且根据分数进行排序,不会做缓存; filter,根据你的查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存,方便下次快速定位查询;
如果你的查询比较精准,即不太在乎匹配数据的分数score,建议使用filter; 如果匹配条件不确定,需要依赖分数score来进行产讯结果的排序,则用query; 不依赖分数score的情况下,filter的性能优于query;
1.2、实例: 依据smsContent字段包含魅力的以及fee消费小于400的filter查询公司的短信内容 1.2.1、RESTful 代码POST /sms-logs-index/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"smsContent": "魅力"
}
},
{
"range": {
"fee": {
"lte": 400
}
}
}
]
}
}
}
package com.chb.test;
import com.chb.utils.ESClient;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
public class FilterDemo {
RestHighLevelClient client = ESClient.getClient();
String index = "sms-logs-index";
@Test
public void filterQuery() throws IOException {
// 1、SearchRequest
SearchRequest searchRequest = new SearchRequest(index);
// 2、指定查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.termQuery("smsContent", "魅力"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("fee").lte(400));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 3、执行
SearchResponse resp = client.search(searchRequest, RequestOptions.DEFAULT);
// 4、打印
for (SearchHit hit : resp.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}
}