ElasticSearch7.X学习三--查询1--组合查询1

官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/sql-cli.html

1. 概念

查询和过滤上下文(query and filter context)

  • relevance score:是es默认用来排序的文档匹配程度高低的相关性分数,是一个24bit的有效数字,不同的查询会有不同的评分,query和filter会影响评分,因为query的时候系统会计算评分,而filter是不影响评分的。
  • query context:在查询上下文中,子句用来回答“这个文档匹配查询子句情况如何”,就是指索引中的数据匹配情况,此时会计算relevance score,用来判断。
  • filter context:在过滤上下文中,是用老回答“这个文档匹配查询子句吗”,此时跟评分表无关。

DSL查询

一个简单的dsl查询

 curl -X GET "localhost:9200/bank/_search?pretty" -H "Content-Type:application/json" -d
 '{
 	"query":
 		{"bool":
 			{ 
 				"must":
 				{
 					"term":{"gender.keyword":"M"},
 			    "filter":{
 			    	"term":{
 			    		"city.keyword":"Sunriver"
 			    	}
 			    }
 			  }
 		}
 	}'

这个语句是指从bank这个索引中查询,先匹配gender是“M”的document,然后再过滤city为"Sunriver"的结果集(这个顺序我不是很确定,文档中暂时没有发现此类说法,如果是关系型数据库会因为创建的不同的索引执行顺序不一样的,但是需求逻辑是一致的)。

Java实现

依赖
java编写访问es的代码需要加入依赖,我用的是maven包管理,加入以下依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.5.1</version>
</dependency>

java代码

//组装查询条件,先组装需要查询的索引
SearchRequest searchRequest = new SearchRequest("bank");
//创建查询条件构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//must
searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("state.keyword","SD"))
           .filter(QueryBuilders.termQuery("gender.keyword","M"))
           .filter(QueryBuilders.rangeQuery("age").gte(30))
);
//将构建的条件加入到searchRequest中
searchRequest.source(searchSourceBuilder);
//使用RestHighLevelClient来访问es
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);

//结果查看
SearchHits searchHits = searchResponse.getHits();
System.out.println(searchHits.getHits().length);

ObjectMapper objectMapper = new ObjectMapper();
for(SearchHit searchHit : searchHits){
			Bank bank=objectMapper.readValue(searchHit.getSourceAsString(),Bank.class);
            System.out.println("-----"+bank.getAccountNumber()+","+bank.getAddress()+", "+bank.getAge());
        }

结束

看了一段时间的es,总是觉得跟关系型数据是类似的,因为我本身是一名DBA,所以很多概念很容易理解,之所以es现在比较流行是因为上手实在太容易了,开箱即用,不像Oracle光安装就能难倒人,但是不可否认的知识点还是很多的,要想深入有难度的。

发布了96 篇原创文章 · 获赞 22 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/chuan_day/article/details/103683860