1 term查询
单值查询,代表完全匹配,类似于mysql中的 = 。在搜索前不会对关键字进行分词,直接去文档分词库匹配。筛选出一个字段等于特定值的所有记录。
会对查询结果进行打分(score),分值越高的数据排名越靠前。
在SQL中:
select * from Chine where address = '北京';
ES中的查询有很大差别,它把sql中的一条数据变成了一个文档
GET /China/_search
{
"query": {
"term": {
"address": {
"value":"北京"
}
}
}
}
Java中用ES查询:
//索引创建查询请求
SearchRequest request = new SearchRequest("China");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//创建查询语句
searchSourceBuilder.query(QueryBuilders.termQuery("address", "北京"));
request.source(searchSourceBuilder);
SearchResponse response = client.search(request, RequestOption.DEFAULT);
2 terms查询
多值查询,和term的查询机制是一样的,不会分词,直接词库匹配。类似于sql里的in查询。terms是在针对一个字段包含多个值的时候使用。
同term一样也会进行打分。
比如,想查询 address 字段中包含关键词 “北京” 或 “天津” 的文档
SQL:
select * from China where address in ('北京', '天津')
ES:
GET /China/_search
{
"query": {
"terms": {
"address": ["北京", "天津"]
}
}
}
Java查询条件:
SearchSourceQuery searchSourceQuery = new SearchSourceQuery();
//构建查询条件
searchSourceQuery.query(QueryBuilders.termsQuery("address","北京","天津"));
就是在北京和天津中间加了个or
3 range查询
范围查询,针对数值类型和日期类型,对某个field进行范围指定,的在查询中能使用gt:> gte:>= lt:< lte:<=。
SQL:
select * from China where distance between 10 and 20
ES:
GET /China/_search
{
"query":{
"range":{
"distance":{
"to":10,
"from":20
}
}
}
}
Java查询条件:
searchSourceBuilder.query(QueryBuilders.rangeQuery("distance").gte(10).lte(20))
4 复合查询(布尔查询)
这可能是今后用的最频繁的查询方式了,它将多个子查询组合成一个布尔表达式(将多个查询查询条件,以一定逻辑组合在一起),子查询间的逻辑关系是“与”,只有子查询的结果都为“true”时,布尔查询的结果才为“true”
must:=;should:or;must not:不匹配条件中的,not;filter:前三个都是看匹配程度,它关注是否匹配,不会进行打分
当涉及到要过滤多个子段时:
select * from China where express_delivery = '顺丰' and address = '北京';
ES:
GET /China/_search
{
"bool":{
"must":[
"term":{
"express_delivery":{
"value":"顺丰"
}
},
"term":{
"address":{
"value":"北京"
}
}
]
}
}
Java查询条件:
searchSourceBuilder.must(QueryBuilders.term("express_delivery","顺丰"));
searchSourceBuilder.must(QueryBuilders.term("address","北京"));
//添加上另两种方式的查询
//查除了北京之外的城市
searchSourceBuilder.mustnot(QueryBuilders.term("address","北京"));
//查北京或天津
searchSourceBuilder.should(QueryBuilders.term("address","北京"));
searchSourceBuilder.should(QueryBuilders.term("address","天津"));
5 聚合查询
5.1 简单聚合
使用aggs来标记聚合语句
ES格式为:
GET /China/_search
{
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
AGG_TYPE的取值类型有:平均值avg,最大值max,最小值min,加和值sum,基础统计stats,统计非空个数value_count
比如max:
GET /China/_search
{
"aggs":{
"my_distance":{
"max": {
"field": "distance"
}
}
}
}
在Java中:
SearchRequest searchRequest = new SearchRequest("China");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 聚合查询条件
AggregationBuilder aggsBuilder = AggregationBuilders.max("my_distance").field("distance");
// 将聚合查询条件构建到SearchSourceBuilder中
searchSourceBuilder.aggregation(aggsBuilder);
其它的修改一下就好了
AggregationBuilder aggsBuilder = AggregationBuilders.min("my_distance").field("distance");
AggregationBuilder aggsBuilder = AggregationBuilders.avg("my_distance").field("distance");
AggregationBuilder aggsBuilder = AggregationBuilders.count("my_distance").field("distance");
5.2 单维度桶聚合
可以看作是单条件分组
比如查询每个城市有多少快递收货点:文章来源:https://www.toymoban.com/news/detail-738833.html
select point,count(id) from China group by address
GET /China/_search
{
"aggs": {
"my_agg": {
"terms": {
"field": "address"
}
}
}
}
AggregationBuilder aggsBuilder = AggregationBuilders.terms("my_agg").field("address");
5.3 多维度桶嵌套聚合
ES支持嵌套桶聚合,进行嵌套时,可以使用aggs子句进行子桶的继续嵌套,指标放在最里面的子桶内。统计各个城市的开门和没开门的快递点平均价格。文章来源地址https://www.toymoban.com/news/detail-738833.html
GET /China/_search
{
"size": 0,
"aggs": {
"my_city": {
"terms": {
"field": "address"
},
"aggs": {
"be_besiness": {
"terms": {
"field": "opening"
},
"aggs": {
"my_sum": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
到了这里,关于Java中ElasticSearch的几个简单查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!