一、创建springboot工程,导入elasticsearch依赖
- "1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-parentartifactId>
- <version>2.7.3version>
- <relativePath/>
- parent>
- <groupId>com.ifungroupId>
- <artifactId>es-demoartifactId>
- <version>0.0.1-SNAPSHOTversion>
- <name>es-demoname>
- <description>Demo project for Spring Bootdescription>
- <properties>
- <java.version>1.8java.version>
- properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starterartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>org.elasticsearch.clientgroupId>
- <artifactId>elasticsearch-rest-high-level-clientartifactId>
- <version>7.9.0version>
- <exclusions>
- <exclusion>
- <groupId>org.elasticsearchgroupId>
- <artifactId>elasticsearchartifactId>
- exclusion>
- exclusions>
- dependency>
- <dependency>
- <groupId>org.elasticsearchgroupId>
- <artifactId>elasticsearchartifactId>
- <version>7.9.0version>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <scope>testscope>
- <version>1.18.24version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>2.0.9version>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- plugin>
- plugins>
- build>
-
- project>
二、编写配置文件,配置elasticsearch的client
- package com.ifun.es.demo.config;
-
- import org.apache.http.HttpHost;
- import org.elasticsearch.client.RestClient;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class ElasticsearchConfig {
-
- @Bean
- public RestHighLevelClient restHighLevelClient(){
- return new RestHighLevelClient(RestClient.builder(
- new HttpHost("192.168.225.123", 9200, "http")));
- }
-
- }
使用的时候只需要自动注入RestHighLevelClient就行了
- @Autowired
- @Qualifier("restHighLevelClient")
- private RestHighLevelClient client;
三、索引相关api
1. 创建索引
- @Test
- void createIndex() throws IOException {
- CreateIndexRequest esDemo = new CreateIndexRequest("es_demo");
- CreateIndexResponse response = client.indices().create(esDemo, RequestOptions.DEFAULT);
- log.info("创建成功,索引信息为{}",response.index());
- }
2. 带配置参数的创建索引
- @Test
- void createIndexWithSettings() throws IOException {
- CreateIndexRequest request = new CreateIndexRequest("user");
- // 1. 准备索引的settings
- Settings.Builder settings = Settings.builder();
- settings.put("number_of_shards", 3);
- settings.put("number_of_replicas", 1);
-
- // 2. 准备关于索引的结构mappings
- XContentBuilder mappings = JsonXContent.contentBuilder()
- .startObject()
- .startObject("properties")
- .startObject("name")
- .field("type", "text")
- .field("analyzer","ik_smart")
- .endObject()
- .startObject("age")
- .field("type", "integer")
- .endObject()
- .startObject("birthday")
- .field("type", "date")
- .field("format", "yyyy-MM-dd")
- .endObject()
- .endObject()
- .endObject();
-
- // 3. 将settings和mappings封装到Request对象中
- request.settings(settings);
- request.mapping(mappings);
-
- CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
- log.info("创建成功,索引名称为:{}",response.index());
- }
对应的语句为
- PUT /user
- {
- "settings": {
- "number_of_replicas": 1,
- "number_of_shards": 3
- },
- "mappings": {
- "properties": {
- "name":{
- "type": "text",
- "analyzer": "ik_smart"
- },
- "age":{
- "type": "integer"
- },
- "birthday":{
- "type": "date",
- "format": "yyyy-MM-dd"
- }
- }
- }
- }
3. 删除索引
- @Test
- void delIndex() throws IOException {
- DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");
- AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
- log.info("删除索引结果:{}",delete.isAcknowledged());
- }
4. 查看索引信息
- @Test
- void getIndex() throws IOException {
- GetIndexRequest getIndexRequest = new GetIndexRequest("user");
- boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
- if (exists){
- GetIndexResponse indexResponse = client.indices().get(getIndexRequest, RequestOptions.DEFAULT);
- MappingMetadata user = indexResponse.getMappings().get("user");
- Map
mappings = user.getSourceAsMap(); - log.info("\nmappings:{}\nsettings:{}", JSON.toJSONString(mappings),indexResponse.getSettings().get("user"));
- }else{
- log.info("索引不存在");
- }
- }
四、文档相关api
1. 保存文档
- @Test
- void postDocument() throws IOException {
- User user = new User();
- user.setAge(78);
- user.setName("张三");
- user.setBirthday("1976-05-08");
- String json = JSON.toJSONString(user);
- IndexRequest indexRequest = new IndexRequest("user");
- // 不传id则使用默认的id
- // indexRequest.id("1");
- indexRequest.source(json, XContentType.JSON);
- IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
- log.info("保存结果:{}",response.toString());
- }
2. 通过id查询文档信息
- @Test
- void getDocumentById() throws IOException {
- //GetRequest必须要带上id这个参数
- GetRequest request = new GetRequest("user","1");
- boolean exists = client.exists(request, RequestOptions.DEFAULT);
- if (exists){
- GetResponse response = client.get(request, RequestOptions.DEFAULT);
- log.info("文档内容{}",response.getSourceAsString());
- }
- }
3. 更新文档信息
- @Test
- void updateDocument() throws IOException {
- UpdateRequest request = new UpdateRequest("user", "1");
- User user = new User();
- user.setName("李新化");
- user.setAge(35);
- request.doc(JSONObject.toJSONString(user),XContentType.JSON);
- UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
- log.info("更新结果:{}",response.toString());
- }
4. 删除文档信息
- @Test
- void delDocumentById() throws IOException {
- DeleteRequest request = new DeleteRequest("user","1");
- DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
- log.info("删除结果:{}",response.toString());
- }
5. 文档批量操作
- /**
- POST /user/_bulk
- {"create":{"_id":"5"}}
- {"name":"王一新","age":24,"birthday":"1969-08-12"}
- {"update":{"_id":"2"}}
- {"doc":{"name":"张新"}}
- {"delete":{"_id":"3"}}
- */
- @Test
- void bulkDocument() throws IOException {
- BulkRequest bulkRequest = new BulkRequest();
- User user = new User();
- user.setAge(24);
- user.setName("王一新");
- user.setBirthday("1969-08-12");
- IndexRequest indexRequest = new IndexRequest("user");
- indexRequest.id("5");
- indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
- bulkRequest.add(indexRequest);
-
- UpdateRequest updateRequest = new UpdateRequest("user", "1");
- User updateUser = new User();
- updateUser.setName("张新");
- updateRequest.doc(JSON.toJSONString(updateUser),XContentType.JSON);
- bulkRequest.add(updateRequest);
-
- DeleteRequest deleteRequest = new DeleteRequest("user", "3");
- bulkRequest.add(deleteRequest);
-
- BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
- log.info("批量操作结果:{}", JSON.toJSONString(response.getItems()));
- }
五、查询相关api
1. match_all
- /**
- GET /user/_search
- {
- "query": {
- "match_all": {}
- }
- }
- */
- @Test
- void matchAllQuery() throws IOException {
- //1.创建一个查询请求对象
- SearchRequest searchRequest = new SearchRequest("user");
- //2. 创建一个查询语句构建器
- SearchSourceBuilder builder = new SearchSourceBuilder();
- //3. 创建match_all 查询构建器
- MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
- //4. 使用builder构建match_all
- builder.query(matchAllQueryBuilder);
- //5. 将builder添加到查询请求中
- searchRequest.source(builder);
- //6. 发起查询请求
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- //7. 获取命中记录,并遍历查询结果
- SearchHits hits = response.getHits();
- log.info("\n查询结果:");
- for (SearchHit hit : hits) {
- log.info("\n{}", hit.getSourceAsString());
- }
- }
2. match
- /**
- GET /user/_search
- {
- "query": {
- "match": {
- "name": "张三"
- }
- }
- }
- */
- @Test
- void matchQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name","张三");
- builder.query(matchQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- SearchHits hits = response.getHits();
- for (SearchHit hit : hits) {
- log.info("{}",hit.getSourceAsString());
- }
- }
3. term
- /**
- GET /user/_search
- {
- "query": {
- "term": {
- "age": {
- "value":"57"
- }
- }
- }
- }
- */
-
- @Test
- void termQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- TermQueryBuilder termQueryBuilder = new TermQueryBuilder("age",78);
- builder.query(termQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- SearchHits hits = response.getHits();
- for (SearchHit hit : hits) {
- log.info("{}",hit.getSourceAsString());
- }
- }
4. prefix
- /**
- GET /user/_search
- {
- "query": {
- "prefix": {
- "name": {
- "value": "张"
- }
- }
- }
- }
- */
- @Test
- void prefixQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- PrefixQueryBuilder prefixQueryBuilder = new PrefixQueryBuilder("name","张");
- builder.query(prefixQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
5. match_phrase
- /**
- GET /user/_search
- {
- "query": {
- "match_phrase": {
- "name": "张三"
- }
- }
- }
- */
- @Test
- void matchPhraseQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- MatchPhraseQueryBuilder matchPhraseQueryBuilder = new MatchPhraseQueryBuilder("name","张三");
- builder.query(matchPhraseQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
6. multi_match
- /**
- GET /user/_search
- {
- "query": {
- "multi_match": {
- "query": "张三",
- "fields": ["name","description"]
- }
- }
- }*/
- @Test
- void multiMatchQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder("张三","name","description");
- builder.query(multiMatchQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
7. terms
- /**
- GET /user/_search
- {
- "query": {
- "terms": {
- "name": [
- "张三",
- "李四",
- "王五"
- ]
- }
- }
- }*/
- @Test
- void termsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder("name","张三","五","李四");
- builder.query(termsQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
8. range
- /**
- GET /user/_search
- {
- "query": {
- "range": {
- "age": {
- "gte": 20,
- "lte": 60
- }
- }
- }
- }*/
- @Test
- void rangeQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
- rangeQueryBuilder.from("20",true);
- rangeQueryBuilder.to("60",true);
- builder.query(rangeQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
9. ids
- /**
- GET /user/_search
- {
- "query": {
- "ids": {
- "values": [
- "1",
- "2",
- "3",
- "4",
- "5"
- ]
- }
- }
- }*/
- @Test
- void idsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- IdsQueryBuilder idsQueryBuilder = new IdsQueryBuilder();
- idsQueryBuilder.addIds("1","2","3","4","5");
- builder.query(idsQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
10. query_string
- /**
- GET /user/_search
- {
- "query": {
- "query_string": {
- "default_field": "name",
- "query": "张三 OR 李四"
- }
- }
- }*/
- @Test
- void stringQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- QueryStringQueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder("张三 OR 李四");
- queryStringQueryBuilder.defaultField("name");
- builder.query(queryStringQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
11. exists
- /**
- GET /user/_search
- {
- "query": {
- "exists": {
- "field": "description"
- }
- }
- }*/
- @Test
- void existsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- ExistsQueryBuilder existsQueryBuilder = new ExistsQueryBuilder("description");
- builder.query(existsQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
12. 对结果进行排序
- /**
- GET /user/_search
- {
- "query": {
- "range": {
- "age": {
- "gte": 20,
- "lte": 60
- }
- }
- },
- "sort": [
- {
- "age": {
- "order": "desc"
- }
- }
- ]
- }*/
- @Test
- void sortResultQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
- rangeQueryBuilder.from("20",true);
- rangeQueryBuilder.to("60",true);
- builder.query(rangeQueryBuilder);
- searchRequest.source(builder);
- //按照age大小倒序
- builder.sort("age", SortOrder.DESC);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
13. 分页查询
- /**
- GET /user/_search
- {
- "query": {
- "range": {
- "age": {
- "gte": 20,
- "lte": 60
- }
- }
- },
- "from": 0,
- "size": 10
- }*/
- @Test
- void sizeResultQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
- rangeQueryBuilder.from("20",true);
- rangeQueryBuilder.to("60",true);
- builder.query(rangeQueryBuilder);
- searchRequest.source(builder);
- //从0索引开始,返回10个数据
- builder.from(0);
- builder.size(10);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
14. bool must
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "must": [
- {
- "match": {
- "name": "张三"
- }
- },
- {
- "range": {
- "age": {
- "gte": 70
- }
- }
- }
- ]
- }
- }
- }*/
-
- @Test
- void boolMustQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //must中可以是多个,所以可以写多个must
- boolQueryBuilder.must(QueryBuilders.matchQuery("name","张三"));
- RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
- rangeQueryBuilder.from(70,true);
- boolQueryBuilder.must(rangeQueryBuilder);
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
15. bool must_not
-
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "must_not": [
- {
- "match": {
- "name": "张三"
- }
- },{
- "exists": {
- "field": "description"
- }
- }
- ]
- }
- }
- }*/
- @Test
- void boolMustNotQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //must_not中可以是多个,所以可以写多个mustNot
- boolQueryBuilder.mustNot(QueryBuilders.existsQuery("description"));
- boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name","张三"));
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
16. bool should
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "should": [
- {
- "match": {
- "name": "张三"
- }
- },
- {
- "exists": {
- "field": "description"
- }
- }
- ]
- }
- }
- }*/
- @Test
- void boolShouldQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //should中可以是多个,所以可以写多个should
- boolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
- boolQueryBuilder.should(QueryBuilders.existsQuery("description"));
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
17. bool filter
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "match": {
- "name": "张三"
- }
- }
- ]
- }
- }
- }*/
- @Test
- void boolFilterQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //filter中可以是多个,所以可以写多个filter
- boolQueryBuilder.filter(QueryBuilders.matchQuery("name","张三"));
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
18. bool 条件组合查询
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "should": [
- {
- "match": {
- "name": "张三"
- }
- }
- ],
- "must_not": [
- {
- "exists": {
- "field": "description"
- }
- }
- ],
- "must": [
- {
- "range": {
- "age": {
- "gt": 10,
- "lt": 70
- }
- }
- }
- ]
- }
- }
- }*/
- /**
- * bool条件组合查询
- */
- @Test
- void boolCombineQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //should mustNo must
- boolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
- boolQueryBuilder.mustNot(QueryBuilders.existsQuery("description"));
- RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
- rangeQueryBuilder.from(10);
- rangeQueryBuilder.to(70);
- boolQueryBuilder.must(rangeQueryBuilder);
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
19. bool 嵌套查询
- /**
- GET /user/_search
- {
- "query": {
- "bool": {
- "must": [
- {
- "bool": {
- "should": [
- {
- "match": {
- "name": "张三"
- }
- },
- {
- "range": {
- "age": {
- "gt": 10,
- "lt": 70
- }
- }
- }
- ]
- }
- }
- ]
- }
- }
- }*/
- /**
- * bool 嵌套查询
- */
- @Test
- void boolNestQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- //must中嵌套should
- BoolQueryBuilder innerBoolQueryBuilder = new BoolQueryBuilder();
- innerBoolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
- RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
- rangeQueryBuilder.from(10);
- rangeQueryBuilder.to(70);
- innerBoolQueryBuilder.should(rangeQueryBuilder);
- boolQueryBuilder.must(innerBoolQueryBuilder);
- builder.query(boolQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
20. fuzzy 模糊查询
- /**
- GET /user/_search
- {
- "query": {
- "fuzzy": {
- "name": {
- "value": "张思",
- "fuzziness": 1
- }
- }
- }
- }*/
- @Test
- void fuzzyQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- FuzzyQueryBuilder fuzzyQueryBuilder = new FuzzyQueryBuilder("name","张思");
- //fuzziness 表示查的词中可以有几个不同的字
- fuzzyQueryBuilder.fuzziness(Fuzziness.ONE);
- builder.query(fuzzyQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
21. nested 嵌套查询
-
- /**
- * nested 嵌套属性查询
- */
- @Test
- void createNestedDoc() throws IOException {
- BulkRequest bulkRequest = new BulkRequest();
- Random random = new Random();
- String[] firstName = new String[]{"张","王","李","赵","成","陈","艾","方","费","车"};
- String[] lastName = new String[]{"小饭","芳芳","烦","西放","东方","阿","不","发","加姐","信息"};
- String[] birthDay = new String[]{"1990-01-12","1995-04-01","1999-01-11","1993-12-12","2000-01-15","2022-01-10","2021-01-12","2000-01-05","2001-05-10","2004-05-15"};
- String[] color = new String[]{"red","yellow","pink"};
- for (int i=0;i<10;i++){
- User user = new User();
- user.setAge(random.nextInt(100)+1);
- user.setName(firstName[random.nextInt(10)]+lastName[random.nextInt(10)]);
- user.setBirthday(birthDay[random.nextInt(10)]);
- Dog dog = new Dog();
- dog.setColor(color[random.nextInt(3)]);
- dog.setWeight(random.nextFloat());
- user.setDog(dog);
- IndexRequest indexRequest = new IndexRequest("user");
- String id = ""+(i+1);
- indexRequest.id(id);
- indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
- bulkRequest.add(indexRequest);
- }
- BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
- log.info("批量操作结果:{}", JSON.toJSONString(response.getItems()));
- }
-
- /**
- GET /user/_search
- {
- "query": {
- "nested": {
- "path": "dog",
- "query": {
- "match": {
- "dog.color": "red"
- }
- }
- }
- }
- }*/
-
- @Test
- void nestedQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- NestedQueryBuilder nestedQueryBuilder = new NestedQueryBuilder("dog",QueryBuilders.matchQuery("dog.color","red"), ScoreMode.None);
- builder.query(nestedQueryBuilder);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- for (SearchHit hit : response.getHits()) {
- log.info("{}",hit.getSourceAsString());
- }
- }
六、聚合操作相关api
1. avg
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-avg-aggs": {
- "avg": {
- "field": "age"
- }
- }
- }
- }*/
-
- @Test
- void avgAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- AvgAggregationBuilder avg = AggregationBuilders.avg("age-avg-aggs").field("age");
- builder.aggregation(avg);
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedAvg parsedAvg = response.getAggregations().get("age-avg-aggs");
- double avgValue = parsedAvg.getValue();
- log.info("平均值:{}",avgValue);
-
- }
2. sum
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-sum-aggs": {
- "sum": {
- "field": "age"
- }
- }
- }
- }*/
- @Test
- void sumAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.sum("age-sum-aggs").field("age"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedSum parsedSum = response.getAggregations().get("age-sum-aggs");
- double sumValue = parsedSum.getValue();
- log.info("总和:{}",sumValue);
- }
3. min
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-min-aggs": {
- "min": {
- "field": "age"
- }
- }
- }
- }*/
-
- @Test
- void minAgeQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.min("age-min-aggs").field("age"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedMin parsedMin = response.getAggregations().get("age-min-aggs");
- double minValue = parsedMin.getValue();
- log.info("最小:{}",minValue);
- }
4. max
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-max-aggs": {
- "max": {
- "field": "age"
- }
- }
- }
- }*/
- @Test
- void maxAgeQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.max("age-max-aggs").field("age"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedMax parsedMax = response.getAggregations().get("age-max-aggs");
- double maxValue = parsedMax.getValue();
- log.info("最大:{}",maxValue);
- }
5. stats
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-stats-aggs": {
- "stats": {
- "field": "age"
- }
- }
- }
- }*/
-
- @Test
- void statsAgeQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.stats("age-stats-aggs").field("age"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedStats parsedStats = response.getAggregations().get("age-stats-aggs");
- double avg = parsedStats.getAvg();
- double max = parsedStats.getMax();
- double min = parsedStats.getMin();
- double sum = parsedStats.getSum();
- long count = parsedStats.getCount();
- log.info("avg:{},max:{},min:{},sum:{},count:{}",avg,max,min,sum,count);
- }
6. extended_stats
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "age-extended-stats-aggs": {
- "extended_stats": {
- "field": "age"
- }
- }
- }
- }*/
- @Test
- void extendedStatsAgeQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.extendedStats("age-extended-stats-aggs").field("age"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedExtendedStats parsedStats = response.getAggregations().get("age-extended-stats-aggs");
- double avg = parsedStats.getAvg();
- double max = parsedStats.getMax();
- double min = parsedStats.getMin();
- double sum = parsedStats.getSum();
- long count = parsedStats.getCount();
- double stdDeviation = parsedStats.getStdDeviation();
- double stdDeviationPopulation = parsedStats.getStdDeviationPopulation();
- double stdDeviationSampling = parsedStats.getStdDeviationSampling();
- double sumOfSquares = parsedStats.getSumOfSquares();
- log.info("avg:{},max:{},min:{},sum:{},count:{},\ndeviation:{},population:{},sampling:{},squares:{}",
- avg,max,min,sum,count,stdDeviation,stdDeviationPopulation,stdDeviationSampling,sumOfSquares);
- }
7. filter
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "filter-aggs": {
- "filter": {
- "match":{
- "name":"不"
- }
- }
- }
- }
- }*/
- @Test
- void filterAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "不");
- builder.aggregation(AggregationBuilders.filter("filter-aggs",matchQueryBuilder));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedFilter parsedFilter = response.getAggregations().get("filter-aggs");
- long docCount = parsedFilter.getDocCount();
- log.info("doc-count:{}",docCount);
- }
8. filters
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "filters-aggs": {
- "filters": {
- "filters": {
- "dog-yellow": {
- "nested": {
- "path": "dog",
- "query": {
- "match": {
- "dog.color": "yellow"
- }
- }
- }
- },
- "dog-red": {
- "nested": {
- "path": "dog",
- "query": {
- "match": {
- "dog.color": "red"
- }
- }
- }
- }
- }
- }
- }
- }
- }*/
-
- @Test
- void filtersAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- NestedQueryBuilder redBuilder = QueryBuilders.nestedQuery("dog", QueryBuilders.matchQuery("dog.color", "red"), ScoreMode.None);
- FiltersAggregator.KeyedFilter keyedRedFilter = new FiltersAggregator.KeyedFilter("dog-red",redBuilder);
- NestedQueryBuilder yellowBuilder = QueryBuilders.nestedQuery("dog", QueryBuilders.matchQuery("dog.color", "yellow"), ScoreMode.None);
- FiltersAggregator.KeyedFilter keyedYellowFilter = new FiltersAggregator.KeyedFilter("dog-yellow",yellowBuilder);
- builder.aggregation(AggregationBuilders.filters("filters-aggs",keyedRedFilter,keyedYellowFilter));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedFilters parsedFilters = response.getAggregations().get("filters-aggs");
- ParsedFilters.ParsedBucket dogRedBucket = parsedFilters.getBucketByKey("dog-red");
- ParsedFilters.ParsedBucket dogYellowBucket = parsedFilters.getBucketByKey("dog-yellow");
- log.info("yellow:{},doc-count:{}",dogYellowBucket.getKeyAsString(),dogYellowBucket.getDocCount());
- log.info("red:{},doc-count:{}",dogRedBucket.getKeyAsString(),dogRedBucket.getDocCount());
- }
9. terms
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "terms-aggs": {
- "terms": {
- "field": "birthday"
- }
- }
- }
- }*/
-
- @Test
- void termsAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.terms("terms-aggs").field("birthday"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedLongTerms parsedLongTerms = response.getAggregations().get("terms-aggs");
- for (Terms.Bucket bucket : parsedLongTerms.getBuckets()) {
- String keyAsString = bucket.getKeyAsString();
- long docCount = bucket.getDocCount();
- log.info("{}:{}",keyAsString,docCount);
- }
- }
10. range
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "range-aggs": {
- "range": {
- "field": "age",
- "ranges": [
- {
- "from": 0,
- "to": 20
- },
- {
- "from": 20,
- "to": 60
- },
- {
- "from": 60,
- "to": 100
- }
- ]
- }
- }
- }
- }*/
- @Test
- void rangeAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.range("range-aggs").field("age")
- .addRange(0,20).addRange(20,60).addRange(60,100));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedRange parsedRange = response.getAggregations().get("range-aggs");
- for (Range.Bucket bucket : parsedRange.getBuckets()) {
- String keyAsString = bucket.getKeyAsString();
- long docCount = bucket.getDocCount();
- log.info("{}:{}",keyAsString,docCount);
- }
- }
11. date_range
- /**
- GET /user/_search
- {
- "size": 0,
- "aggs": {
- "date-rang-aggs": {
- "date_range": {
- "field": "birthday",
- "ranges": [
- {
- "from": "1992-01-01",
- "to": "1994-01-01"
- },
- {
- "from": "1994-01-01",
- "to": "1999-01-01"
- },
- {
- "from": "1999-01-01",
- "to": "2022-01-01"
- }
- ]
- }
- }
- }
- }*/
- @Test
- void dateRangeAggsQuery() throws IOException {
- SearchRequest searchRequest = new SearchRequest("user");
- SearchSourceBuilder builder = new SearchSourceBuilder();
- builder.aggregation(AggregationBuilders.dateRange("date-range-aggs").field("birthday")
- .addRange("1992-01-01","1994-01-01").addRange("1994-01-01","1999-01-01").addRange("1999-01-01","2022-01-01"));
- searchRequest.source(builder);
- SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
- ParsedDateRange parsedDateRange = response.getAggregations().get("date-range-aggs");
- for (Range.Bucket bucket : parsedDateRange.getBuckets()) {
- String keyAsString = bucket.getKeyAsString();
- long docCount = bucket.getDocCount();
- log.info("{}:{}",keyAsString,docCount);
- }
- }
七、总结
Elasticsearch 在springboot中的相关操作就介绍这么多了,应该都够用了,哈哈哈