elasticsearch 的java驱动中,提供了许多查询尔对构造方式,如下:
org.elasticsearch.index.query.QueryBuilders
queryName | 说明 | 关键词分词 |
---|---|---|
matchAllQuery | 查询所有 | |
matchQuery | 分词 | |
multiMatchQuery | 分词 | |
matchPhraseQuery | 不 | |
matchPhrasePrefixQuery | 不 | |
idsQuery | 根据_id查询文档 | |
termQuery | 匹配term | 不 |
termsQuery | 匹配任何一个term | 不 |
fuzzyQuery | 模糊,相似(自动判断) | |
prefixQuery | start with | |
rangeQuery | 范围(gt、lt、gte、lte) | |
wildcardQuery | 模糊(*匹配任意、?匹配单个字符) | |
regexpQuery | k.*y 匹配 ky、key | |
queryStringQuery | 编写query_string(不推荐) | |
simpleQueryStringQuery | 编写query_string | |
existsQuery | 存在某个字段 | |
Term查询不会对字段进行分词查询,会采用精确匹配。
Match会根据该字段的分词器,进行分词查询。
es中有以上常用的查询,bool查询就是使用must、should、must_not组合以上各个查询的查询方式。
RestHighLevelClient查询es示例
@Autowired
private RestHighLevelClient esClient;
/**
* 使用boolQuery查询es
* @param indices 索引名称
* @return
*/
public Map<String, List<SearchHit>> esBoolQuery(String... indices) {
SearchRequest searchRequest = new SearchRequest(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 建立一个bool查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(
QueryBuilders.rangeQuery("month")
.gte(startMonth)
.lte(endMonth)
)
.mustNot(
QueryBuilders.matchPhraseQuery("idCardNo", idNo).boost(1.2F)
)
.filter(
QueryBuilders.fuzzyQuery("name", "王")
)
.filter(
QueryBuilders.wildcardQuery("name", "王*")
);
sourceBuilder.query(boolQueryBuilder);
// 包含字段和忽略字段
sourceBuilder.fetchSource(new String[]{"name", "age"}, new String[]{"id"});
// 排序
sourceBuilder.sort("name", SortOrder.DESC);
// 分页
sourceBuilder.from(0);
sourceBuilder.size(10);
// 聚合函数
sourceBuilder.aggregation(AggregationBuilders.sum("age"));
// 高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span class=\"highlight\">");
highlightBuilder.postTags("</span>");
highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
// 查询
SearchResponse response;
try {
response = esClient.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
LOGGER.error("es查询失败!", e);
return null;
}
// 处理查询结果
SearchHits hits = response.getHits();
return Arrays.stream(hits.getHits()).collect(Collectors.groupingBy(SearchHit::getIndex));
}