一、常用查询关键字
- match 查询
match查询会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
{ "match": { "name": "南山" }}
QueryBuilders.matchQuery("name", "南山") #java代码
2.match_phrase
默认使用 match_phrase 时会精确匹配查询的短语,需要全部单词和顺序要完全一样,标点符号除外。
{"query":{"match_phrase":{"sign": "好烦恼"}}}
QueryBuilders.matchPhraseQuery(“sign”,"好烦恼")
3.match_phrase_prefix
match_phrase_prefix 和 match_phrase 用法是一样的,区别就在于它允许对最后一个词条前缀匹配。
{"query":{"match_phrase_prefix":{"sign": "我就"}}}
QueryBuilders.matchPhrasePrefixQuery("sign","我就")
- multi_match 查询
multi_match 查询可以在多个字段上执行相同的 match 查询
{
"multi_match": {
"query": "full text search",
"fields": [ "title", "body" ]
}
}
//前一个参数为要查询的数据,后面的为属性名
QueryBuilders.multiMatchQuery("full text search","body","title");
5.range 查询
range 查询找出那些落在指定区间内的数字或者时间:
{
"range": {
"age": {
"gte": 20, #gt 大于 gte 大于等于
"lt": 30 #lt 小于 lte 小于等于
}
}
}
QueryBuilders.rangeQuery("age").gte(20).lt(30)
6.term 查询
term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串:
{ "term": { "age":26}}
{ "term": {"date":"2014-09-01"}}
{ "term": { "sign": "英雄"}}
{ "term": { "tag": "full_text"}}
QueryBuilders.termQuery("sign", "英雄")
7.terms 查询
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:
{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}
QueryBuilders.termsQuery("sign","英雄","烦恼");
8.exists 查询和 missing 查询
exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性:
{"exists": {"field": "title"}}
QueryBuilders.existsQuery("title");
9.fuzzy 模糊查询(需要给字段添加分词,不然可能不生效)
{ "query": {"match": {"content": {"query": "elastoc","fuzziness": "auto"}}}}
QueryBuilders.fuzzyQuery("name", "三");
二、组合多查询
bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。
1.must
文档 必须must 匹配这些条件才能被包含进来,与 AND 等价。
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("sign", "英雄"))
2.must_not
文档 必须不 must_not 匹配这些条件才能被包含进来,与 NOT 等价。
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.mustNot(QueryBuilders.termQuery("sign", "英雄"))
3.should
至少有一个语句要匹配,与 OR 等价
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(QueryBuilders.termQuery("sign", "英雄"))
4.filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.filter(QueryBuilders.termQuery("sign", "英雄"))
基础参考
三、高级查询
(1)统计某个字段的数量count
ValueCountBuilder vcb= AggregationBuilders.count("count_uid").field("uid");
(2)去重统计某个字段的数量(有少量误差)cardinality
CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");
(3)聚合过滤filter
FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));
(4)按某个字段分组filter
TermsBuilder tb= AggregationBuilders.terms("group_name").field("name");
(5)求和sum
SumBuilder sumBuilder= AggregationBuilders.sum("sum_price").field("price");
(6)求平均avg
AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");
(7)求最大值max
MaxBuilder mb= AggregationBuilders.max("max_price").field("price");
(8)求最小值min
MinBuilder min= AggregationBuilders.min("min_price").field("price");
(9)按日期间隔分组dateHistogram
DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");
(10)获取聚合里面的结果topHits
TopHitsBuilder thb= AggregationBuilders.topHits("top_result");
(11)嵌套的聚合nested
NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
(12)反转嵌套reverseNested
AggregationBuilders.reverseNested("res_negsted").path("kps ");
聚合参考
https://blog.csdn.net/u012998680/article/details/120023384
实际使用参考
https://editor.csdn.net/md/?articleId=128201878