• Springboot 中使用elasticsearch


    一、创建springboot工程,导入elasticsearch依赖

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.3version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.ifungroupId>
    12. <artifactId>es-demoartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>es-demoname>
    15. <description>Demo project for Spring Bootdescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starterartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. <dependency>
    30. <groupId>org.elasticsearch.clientgroupId>
    31. <artifactId>elasticsearch-rest-high-level-clientartifactId>
    32. <version>7.9.0version>
    33. <exclusions>
    34. <exclusion>
    35. <groupId>org.elasticsearchgroupId>
    36. <artifactId>elasticsearchartifactId>
    37. exclusion>
    38. exclusions>
    39. dependency>
    40. <dependency>
    41. <groupId>org.elasticsearchgroupId>
    42. <artifactId>elasticsearchartifactId>
    43. <version>7.9.0version>
    44. dependency>
    45. <dependency>
    46. <groupId>org.projectlombokgroupId>
    47. <artifactId>lombokartifactId>
    48. <scope>testscope>
    49. <version>1.18.24version>
    50. dependency>
    51. <dependency>
    52. <groupId>com.alibabagroupId>
    53. <artifactId>fastjsonartifactId>
    54. <version>2.0.9version>
    55. dependency>
    56. <dependency>
    57. <groupId>org.projectlombokgroupId>
    58. <artifactId>lombokartifactId>
    59. dependency>
    60. dependencies>
    61. <build>
    62. <plugins>
    63. <plugin>
    64. <groupId>org.springframework.bootgroupId>
    65. <artifactId>spring-boot-maven-pluginartifactId>
    66. plugin>
    67. plugins>
    68. build>
    69. project>

    二、编写配置文件,配置elasticsearch的client

    1. package com.ifun.es.demo.config;
    2. import org.apache.http.HttpHost;
    3. import org.elasticsearch.client.RestClient;
    4. import org.elasticsearch.client.RestHighLevelClient;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. @Configuration
    8. public class ElasticsearchConfig {
    9. @Bean
    10. public RestHighLevelClient restHighLevelClient(){
    11. return new RestHighLevelClient(RestClient.builder(
    12. new HttpHost("192.168.225.123", 9200, "http")));
    13. }
    14. }

    使用的时候只需要自动注入RestHighLevelClient就行了

    1. @Autowired
    2. @Qualifier("restHighLevelClient")
    3. private RestHighLevelClient client;

    三、索引相关api

    1. 创建索引

    1. @Test
    2. void createIndex() throws IOException {
    3. CreateIndexRequest esDemo = new CreateIndexRequest("es_demo");
    4. CreateIndexResponse response = client.indices().create(esDemo, RequestOptions.DEFAULT);
    5. log.info("创建成功,索引信息为{}",response.index());
    6. }

    2. 带配置参数的创建索引

    1. @Test
    2. void createIndexWithSettings() throws IOException {
    3. CreateIndexRequest request = new CreateIndexRequest("user");
    4. // 1. 准备索引的settings
    5. Settings.Builder settings = Settings.builder();
    6. settings.put("number_of_shards", 3);
    7. settings.put("number_of_replicas", 1);
    8. // 2. 准备关于索引的结构mappings
    9. XContentBuilder mappings = JsonXContent.contentBuilder()
    10. .startObject()
    11. .startObject("properties")
    12. .startObject("name")
    13. .field("type", "text")
    14. .field("analyzer","ik_smart")
    15. .endObject()
    16. .startObject("age")
    17. .field("type", "integer")
    18. .endObject()
    19. .startObject("birthday")
    20. .field("type", "date")
    21. .field("format", "yyyy-MM-dd")
    22. .endObject()
    23. .endObject()
    24. .endObject();
    25. // 3. 将settings和mappings封装到Request对象中
    26. request.settings(settings);
    27. request.mapping(mappings);
    28. CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
    29. log.info("创建成功,索引名称为:{}",response.index());
    30. }

    对应的语句为

    1. PUT /user
    2. {
    3. "settings": {
    4. "number_of_replicas": 1,
    5. "number_of_shards": 3
    6. },
    7. "mappings": {
    8. "properties": {
    9. "name":{
    10. "type": "text",
    11. "analyzer": "ik_smart"
    12. },
    13. "age":{
    14. "type": "integer"
    15. },
    16. "birthday":{
    17. "type": "date",
    18. "format": "yyyy-MM-dd"
    19. }
    20. }
    21. }
    22. }

    3. 删除索引

    1. @Test
    2. void delIndex() throws IOException {
    3. DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");
    4. AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
    5. log.info("删除索引结果:{}",delete.isAcknowledged());
    6. }

    4. 查看索引信息

    1. @Test
    2. void getIndex() throws IOException {
    3. GetIndexRequest getIndexRequest = new GetIndexRequest("user");
    4. boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
    5. if (exists){
    6. GetIndexResponse indexResponse = client.indices().get(getIndexRequest, RequestOptions.DEFAULT);
    7. MappingMetadata user = indexResponse.getMappings().get("user");
    8. Map mappings = user.getSourceAsMap();
    9. log.info("\nmappings:{}\nsettings:{}", JSON.toJSONString(mappings),indexResponse.getSettings().get("user"));
    10. }else{
    11. log.info("索引不存在");
    12. }
    13. }

    四、文档相关api

    1. 保存文档

    1. @Test
    2. void postDocument() throws IOException {
    3. User user = new User();
    4. user.setAge(78);
    5. user.setName("张三");
    6. user.setBirthday("1976-05-08");
    7. String json = JSON.toJSONString(user);
    8. IndexRequest indexRequest = new IndexRequest("user");
    9. // 不传id则使用默认的id
    10. // indexRequest.id("1");
    11. indexRequest.source(json, XContentType.JSON);
    12. IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
    13. log.info("保存结果:{}",response.toString());
    14. }

    2. 通过id查询文档信息

    1. @Test
    2. void getDocumentById() throws IOException {
    3. //GetRequest必须要带上id这个参数
    4. GetRequest request = new GetRequest("user","1");
    5. boolean exists = client.exists(request, RequestOptions.DEFAULT);
    6. if (exists){
    7. GetResponse response = client.get(request, RequestOptions.DEFAULT);
    8. log.info("文档内容{}",response.getSourceAsString());
    9. }
    10. }

    3. 更新文档信息

    1. @Test
    2. void updateDocument() throws IOException {
    3. UpdateRequest request = new UpdateRequest("user", "1");
    4. User user = new User();
    5. user.setName("李新化");
    6. user.setAge(35);
    7. request.doc(JSONObject.toJSONString(user),XContentType.JSON);
    8. UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
    9. log.info("更新结果:{}",response.toString());
    10. }

    4. 删除文档信息

    1. @Test
    2. void delDocumentById() throws IOException {
    3. DeleteRequest request = new DeleteRequest("user","1");
    4. DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
    5. log.info("删除结果:{}",response.toString());
    6. }

    5. 文档批量操作

    1. /**
    2. POST /user/_bulk
    3. {"create":{"_id":"5"}}
    4. {"name":"王一新","age":24,"birthday":"1969-08-12"}
    5. {"update":{"_id":"2"}}
    6. {"doc":{"name":"张新"}}
    7. {"delete":{"_id":"3"}}
    8. */
    9. @Test
    10. void bulkDocument() throws IOException {
    11. BulkRequest bulkRequest = new BulkRequest();
    12. User user = new User();
    13. user.setAge(24);
    14. user.setName("王一新");
    15. user.setBirthday("1969-08-12");
    16. IndexRequest indexRequest = new IndexRequest("user");
    17. indexRequest.id("5");
    18. indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
    19. bulkRequest.add(indexRequest);
    20. UpdateRequest updateRequest = new UpdateRequest("user", "1");
    21. User updateUser = new User();
    22. updateUser.setName("张新");
    23. updateRequest.doc(JSON.toJSONString(updateUser),XContentType.JSON);
    24. bulkRequest.add(updateRequest);
    25. DeleteRequest deleteRequest = new DeleteRequest("user", "3");
    26. bulkRequest.add(deleteRequest);
    27. BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    28. log.info("批量操作结果:{}", JSON.toJSONString(response.getItems()));
    29. }

    五、查询相关api

    1. match_all

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "match_all": {}
    6. }
    7. }
    8. */
    9. @Test
    10. void matchAllQuery() throws IOException {
    11. //1.创建一个查询请求对象
    12. SearchRequest searchRequest = new SearchRequest("user");
    13. //2. 创建一个查询语句构建器
    14. SearchSourceBuilder builder = new SearchSourceBuilder();
    15. //3. 创建match_all 查询构建器
    16. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
    17. //4. 使用builder构建match_all
    18. builder.query(matchAllQueryBuilder);
    19. //5. 将builder添加到查询请求中
    20. searchRequest.source(builder);
    21. //6. 发起查询请求
    22. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    23. //7. 获取命中记录,并遍历查询结果
    24. SearchHits hits = response.getHits();
    25. log.info("\n查询结果:");
    26. for (SearchHit hit : hits) {
    27. log.info("\n{}", hit.getSourceAsString());
    28. }
    29. }

    2. match

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "match": {
    6. "name": "张三"
    7. }
    8. }
    9. }
    10. */
    11. @Test
    12. void matchQuery() throws IOException {
    13. SearchRequest searchRequest = new SearchRequest("user");
    14. SearchSourceBuilder builder = new SearchSourceBuilder();
    15. MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name","张三");
    16. builder.query(matchQueryBuilder);
    17. searchRequest.source(builder);
    18. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    19. SearchHits hits = response.getHits();
    20. for (SearchHit hit : hits) {
    21. log.info("{}",hit.getSourceAsString());
    22. }
    23. }

    3. term

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "term": {
    6. "age": {
    7. "value":"57"
    8. }
    9. }
    10. }
    11. }
    12. */
    13. @Test
    14. void termQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. TermQueryBuilder termQueryBuilder = new TermQueryBuilder("age",78);
    18. builder.query(termQueryBuilder);
    19. searchRequest.source(builder);
    20. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    21. SearchHits hits = response.getHits();
    22. for (SearchHit hit : hits) {
    23. log.info("{}",hit.getSourceAsString());
    24. }
    25. }

    4. prefix

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "prefix": {
    6. "name": {
    7. "value": "张"
    8. }
    9. }
    10. }
    11. }
    12. */
    13. @Test
    14. void prefixQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. PrefixQueryBuilder prefixQueryBuilder = new PrefixQueryBuilder("name","张");
    18. builder.query(prefixQueryBuilder);
    19. searchRequest.source(builder);
    20. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    21. for (SearchHit hit : response.getHits()) {
    22. log.info("{}",hit.getSourceAsString());
    23. }
    24. }

    5. match_phrase

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "match_phrase": {
    6. "name": "张三"
    7. }
    8. }
    9. }
    10. */
    11. @Test
    12. void matchPhraseQuery() throws IOException {
    13. SearchRequest searchRequest = new SearchRequest("user");
    14. SearchSourceBuilder builder = new SearchSourceBuilder();
    15. MatchPhraseQueryBuilder matchPhraseQueryBuilder = new MatchPhraseQueryBuilder("name","张三");
    16. builder.query(matchPhraseQueryBuilder);
    17. searchRequest.source(builder);
    18. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    19. for (SearchHit hit : response.getHits()) {
    20. log.info("{}",hit.getSourceAsString());
    21. }
    22. }

    6. multi_match

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "multi_match": {
    6. "query": "张三",
    7. "fields": ["name","description"]
    8. }
    9. }
    10. }*/
    11. @Test
    12. void multiMatchQuery() throws IOException {
    13. SearchRequest searchRequest = new SearchRequest("user");
    14. SearchSourceBuilder builder = new SearchSourceBuilder();
    15. MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder("张三","name","description");
    16. builder.query(multiMatchQueryBuilder);
    17. searchRequest.source(builder);
    18. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    19. for (SearchHit hit : response.getHits()) {
    20. log.info("{}",hit.getSourceAsString());
    21. }
    22. }

    7. terms

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "terms": {
    6. "name": [
    7. "张三",
    8. "李四",
    9. "王五"
    10. ]
    11. }
    12. }
    13. }*/
    14. @Test
    15. void termsQuery() throws IOException {
    16. SearchRequest searchRequest = new SearchRequest("user");
    17. SearchSourceBuilder builder = new SearchSourceBuilder();
    18. TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder("name","张三","五","李四");
    19. builder.query(termsQueryBuilder);
    20. searchRequest.source(builder);
    21. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    22. for (SearchHit hit : response.getHits()) {
    23. log.info("{}",hit.getSourceAsString());
    24. }
    25. }

    8. range

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "range": {
    6. "age": {
    7. "gte": 20,
    8. "lte": 60
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void rangeQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
    18. rangeQueryBuilder.from("20",true);
    19. rangeQueryBuilder.to("60",true);
    20. builder.query(rangeQueryBuilder);
    21. searchRequest.source(builder);
    22. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    23. for (SearchHit hit : response.getHits()) {
    24. log.info("{}",hit.getSourceAsString());
    25. }
    26. }

    9. ids

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "ids": {
    6. "values": [
    7. "1",
    8. "2",
    9. "3",
    10. "4",
    11. "5"
    12. ]
    13. }
    14. }
    15. }*/
    16. @Test
    17. void idsQuery() throws IOException {
    18. SearchRequest searchRequest = new SearchRequest("user");
    19. SearchSourceBuilder builder = new SearchSourceBuilder();
    20. IdsQueryBuilder idsQueryBuilder = new IdsQueryBuilder();
    21. idsQueryBuilder.addIds("1","2","3","4","5");
    22. builder.query(idsQueryBuilder);
    23. searchRequest.source(builder);
    24. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    25. for (SearchHit hit : response.getHits()) {
    26. log.info("{}",hit.getSourceAsString());
    27. }
    28. }

    10. query_string

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "query_string": {
    6. "default_field": "name",
    7. "query": "张三 OR 李四"
    8. }
    9. }
    10. }*/
    11. @Test
    12. void stringQuery() throws IOException {
    13. SearchRequest searchRequest = new SearchRequest("user");
    14. SearchSourceBuilder builder = new SearchSourceBuilder();
    15. QueryStringQueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder("张三 OR 李四");
    16. queryStringQueryBuilder.defaultField("name");
    17. builder.query(queryStringQueryBuilder);
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. for (SearchHit hit : response.getHits()) {
    21. log.info("{}",hit.getSourceAsString());
    22. }
    23. }

    11. exists

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "exists": {
    6. "field": "description"
    7. }
    8. }
    9. }*/
    10. @Test
    11. void existsQuery() throws IOException {
    12. SearchRequest searchRequest = new SearchRequest("user");
    13. SearchSourceBuilder builder = new SearchSourceBuilder();
    14. ExistsQueryBuilder existsQueryBuilder = new ExistsQueryBuilder("description");
    15. builder.query(existsQueryBuilder);
    16. searchRequest.source(builder);
    17. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    18. for (SearchHit hit : response.getHits()) {
    19. log.info("{}",hit.getSourceAsString());
    20. }
    21. }

    12. 对结果进行排序

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "range": {
    6. "age": {
    7. "gte": 20,
    8. "lte": 60
    9. }
    10. }
    11. },
    12. "sort": [
    13. {
    14. "age": {
    15. "order": "desc"
    16. }
    17. }
    18. ]
    19. }*/
    20. @Test
    21. void sortResultQuery() throws IOException {
    22. SearchRequest searchRequest = new SearchRequest("user");
    23. SearchSourceBuilder builder = new SearchSourceBuilder();
    24. RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
    25. rangeQueryBuilder.from("20",true);
    26. rangeQueryBuilder.to("60",true);
    27. builder.query(rangeQueryBuilder);
    28. searchRequest.source(builder);
    29. //按照age大小倒序
    30. builder.sort("age", SortOrder.DESC);
    31. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    32. for (SearchHit hit : response.getHits()) {
    33. log.info("{}",hit.getSourceAsString());
    34. }
    35. }

    13. 分页查询

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "range": {
    6. "age": {
    7. "gte": 20,
    8. "lte": 60
    9. }
    10. }
    11. },
    12. "from": 0,
    13. "size": 10
    14. }*/
    15. @Test
    16. void sizeResultQuery() throws IOException {
    17. SearchRequest searchRequest = new SearchRequest("user");
    18. SearchSourceBuilder builder = new SearchSourceBuilder();
    19. RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");
    20. rangeQueryBuilder.from("20",true);
    21. rangeQueryBuilder.to("60",true);
    22. builder.query(rangeQueryBuilder);
    23. searchRequest.source(builder);
    24. //从0索引开始,返回10个数据
    25. builder.from(0);
    26. builder.size(10);
    27. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    28. for (SearchHit hit : response.getHits()) {
    29. log.info("{}",hit.getSourceAsString());
    30. }
    31. }

    14. bool must

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "must": [
    7. {
    8. "match": {
    9. "name": "张三"
    10. }
    11. },
    12. {
    13. "range": {
    14. "age": {
    15. "gte": 70
    16. }
    17. }
    18. }
    19. ]
    20. }
    21. }
    22. }*/
    23. @Test
    24. void boolMustQuery() throws IOException {
    25. SearchRequest searchRequest = new SearchRequest("user");
    26. SearchSourceBuilder builder = new SearchSourceBuilder();
    27. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    28. //must中可以是多个,所以可以写多个must
    29. boolQueryBuilder.must(QueryBuilders.matchQuery("name","张三"));
    30. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
    31. rangeQueryBuilder.from(70,true);
    32. boolQueryBuilder.must(rangeQueryBuilder);
    33. builder.query(boolQueryBuilder);
    34. searchRequest.source(builder);
    35. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    36. for (SearchHit hit : response.getHits()) {
    37. log.info("{}",hit.getSourceAsString());
    38. }
    39. }

    15. bool must_not

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "must_not": [
    7. {
    8. "match": {
    9. "name": "张三"
    10. }
    11. },{
    12. "exists": {
    13. "field": "description"
    14. }
    15. }
    16. ]
    17. }
    18. }
    19. }*/
    20. @Test
    21. void boolMustNotQuery() throws IOException {
    22. SearchRequest searchRequest = new SearchRequest("user");
    23. SearchSourceBuilder builder = new SearchSourceBuilder();
    24. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    25. //must_not中可以是多个,所以可以写多个mustNot
    26. boolQueryBuilder.mustNot(QueryBuilders.existsQuery("description"));
    27. boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name","张三"));
    28. builder.query(boolQueryBuilder);
    29. searchRequest.source(builder);
    30. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    31. for (SearchHit hit : response.getHits()) {
    32. log.info("{}",hit.getSourceAsString());
    33. }
    34. }

    16. bool should

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "should": [
    7. {
    8. "match": {
    9. "name": "张三"
    10. }
    11. },
    12. {
    13. "exists": {
    14. "field": "description"
    15. }
    16. }
    17. ]
    18. }
    19. }
    20. }*/
    21. @Test
    22. void boolShouldQuery() throws IOException {
    23. SearchRequest searchRequest = new SearchRequest("user");
    24. SearchSourceBuilder builder = new SearchSourceBuilder();
    25. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    26. //should中可以是多个,所以可以写多个should
    27. boolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
    28. boolQueryBuilder.should(QueryBuilders.existsQuery("description"));
    29. builder.query(boolQueryBuilder);
    30. searchRequest.source(builder);
    31. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    32. for (SearchHit hit : response.getHits()) {
    33. log.info("{}",hit.getSourceAsString());
    34. }
    35. }

    17. bool filter

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "filter": [
    7. {
    8. "match": {
    9. "name": "张三"
    10. }
    11. }
    12. ]
    13. }
    14. }
    15. }*/
    16. @Test
    17. void boolFilterQuery() throws IOException {
    18. SearchRequest searchRequest = new SearchRequest("user");
    19. SearchSourceBuilder builder = new SearchSourceBuilder();
    20. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    21. //filter中可以是多个,所以可以写多个filter
    22. boolQueryBuilder.filter(QueryBuilders.matchQuery("name","张三"));
    23. builder.query(boolQueryBuilder);
    24. searchRequest.source(builder);
    25. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    26. for (SearchHit hit : response.getHits()) {
    27. log.info("{}",hit.getSourceAsString());
    28. }
    29. }

    18. bool 条件组合查询

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "should": [
    7. {
    8. "match": {
    9. "name": "张三"
    10. }
    11. }
    12. ],
    13. "must_not": [
    14. {
    15. "exists": {
    16. "field": "description"
    17. }
    18. }
    19. ],
    20. "must": [
    21. {
    22. "range": {
    23. "age": {
    24. "gt": 10,
    25. "lt": 70
    26. }
    27. }
    28. }
    29. ]
    30. }
    31. }
    32. }*/
    33. /**
    34. * bool条件组合查询
    35. */
    36. @Test
    37. void boolCombineQuery() throws IOException {
    38. SearchRequest searchRequest = new SearchRequest("user");
    39. SearchSourceBuilder builder = new SearchSourceBuilder();
    40. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    41. //should mustNo must
    42. boolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
    43. boolQueryBuilder.mustNot(QueryBuilders.existsQuery("description"));
    44. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
    45. rangeQueryBuilder.from(10);
    46. rangeQueryBuilder.to(70);
    47. boolQueryBuilder.must(rangeQueryBuilder);
    48. builder.query(boolQueryBuilder);
    49. searchRequest.source(builder);
    50. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    51. for (SearchHit hit : response.getHits()) {
    52. log.info("{}",hit.getSourceAsString());
    53. }
    54. }

    19. bool 嵌套查询

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "must": [
    7. {
    8. "bool": {
    9. "should": [
    10. {
    11. "match": {
    12. "name": "张三"
    13. }
    14. },
    15. {
    16. "range": {
    17. "age": {
    18. "gt": 10,
    19. "lt": 70
    20. }
    21. }
    22. }
    23. ]
    24. }
    25. }
    26. ]
    27. }
    28. }
    29. }*/
    30. /**
    31. * bool 嵌套查询
    32. */
    33. @Test
    34. void boolNestQuery() throws IOException {
    35. SearchRequest searchRequest = new SearchRequest("user");
    36. SearchSourceBuilder builder = new SearchSourceBuilder();
    37. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    38. //must中嵌套should
    39. BoolQueryBuilder innerBoolQueryBuilder = new BoolQueryBuilder();
    40. innerBoolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
    41. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
    42. rangeQueryBuilder.from(10);
    43. rangeQueryBuilder.to(70);
    44. innerBoolQueryBuilder.should(rangeQueryBuilder);
    45. boolQueryBuilder.must(innerBoolQueryBuilder);
    46. builder.query(boolQueryBuilder);
    47. searchRequest.source(builder);
    48. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    49. for (SearchHit hit : response.getHits()) {
    50. log.info("{}",hit.getSourceAsString());
    51. }
    52. }

    20. fuzzy 模糊查询

    1. /**
    2. GET /user/_search
    3. {
    4. "query": {
    5. "fuzzy": {
    6. "name": {
    7. "value": "张思",
    8. "fuzziness": 1
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void fuzzyQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. FuzzyQueryBuilder fuzzyQueryBuilder = new FuzzyQueryBuilder("name","张思");
    18. //fuzziness 表示查的词中可以有几个不同的字
    19. fuzzyQueryBuilder.fuzziness(Fuzziness.ONE);
    20. builder.query(fuzzyQueryBuilder);
    21. searchRequest.source(builder);
    22. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    23. for (SearchHit hit : response.getHits()) {
    24. log.info("{}",hit.getSourceAsString());
    25. }
    26. }

    21. nested 嵌套查询

    1. /**
    2. * nested 嵌套属性查询
    3. */
    4. @Test
    5. void createNestedDoc() throws IOException {
    6. BulkRequest bulkRequest = new BulkRequest();
    7. Random random = new Random();
    8. String[] firstName = new String[]{"张","王","李","赵","成","陈","艾","方","费","车"};
    9. String[] lastName = new String[]{"小饭","芳芳","烦","西放","东方","阿","不","发","加姐","信息"};
    10. 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"};
    11. String[] color = new String[]{"red","yellow","pink"};
    12. for (int i=0;i<10;i++){
    13. User user = new User();
    14. user.setAge(random.nextInt(100)+1);
    15. user.setName(firstName[random.nextInt(10)]+lastName[random.nextInt(10)]);
    16. user.setBirthday(birthDay[random.nextInt(10)]);
    17. Dog dog = new Dog();
    18. dog.setColor(color[random.nextInt(3)]);
    19. dog.setWeight(random.nextFloat());
    20. user.setDog(dog);
    21. IndexRequest indexRequest = new IndexRequest("user");
    22. String id = ""+(i+1);
    23. indexRequest.id(id);
    24. indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
    25. bulkRequest.add(indexRequest);
    26. }
    27. BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    28. log.info("批量操作结果:{}", JSON.toJSONString(response.getItems()));
    29. }
    30. /**
    31. GET /user/_search
    32. {
    33. "query": {
    34. "nested": {
    35. "path": "dog",
    36. "query": {
    37. "match": {
    38. "dog.color": "red"
    39. }
    40. }
    41. }
    42. }
    43. }*/
    44. @Test
    45. void nestedQuery() throws IOException {
    46. SearchRequest searchRequest = new SearchRequest("user");
    47. SearchSourceBuilder builder = new SearchSourceBuilder();
    48. NestedQueryBuilder nestedQueryBuilder = new NestedQueryBuilder("dog",QueryBuilders.matchQuery("dog.color","red"), ScoreMode.None);
    49. builder.query(nestedQueryBuilder);
    50. searchRequest.source(builder);
    51. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    52. for (SearchHit hit : response.getHits()) {
    53. log.info("{}",hit.getSourceAsString());
    54. }
    55. }

    六、聚合操作相关api

    1. avg

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-avg-aggs": {
    7. "avg": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void avgAggsQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. AvgAggregationBuilder avg = AggregationBuilders.avg("age-avg-aggs").field("age");
    18. builder.aggregation(avg);
    19. searchRequest.source(builder);
    20. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    21. ParsedAvg parsedAvg = response.getAggregations().get("age-avg-aggs");
    22. double avgValue = parsedAvg.getValue();
    23. log.info("平均值:{}",avgValue);
    24. }

    2. sum

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-sum-aggs": {
    7. "sum": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void sumAggsQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.sum("age-sum-aggs").field("age"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedSum parsedSum = response.getAggregations().get("age-sum-aggs");
    21. double sumValue = parsedSum.getValue();
    22. log.info("总和:{}",sumValue);
    23. }

    3.  min

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-min-aggs": {
    7. "min": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void minAgeQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.min("age-min-aggs").field("age"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedMin parsedMin = response.getAggregations().get("age-min-aggs");
    21. double minValue = parsedMin.getValue();
    22. log.info("最小:{}",minValue);
    23. }

    4.  max

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-max-aggs": {
    7. "max": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void maxAgeQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.max("age-max-aggs").field("age"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedMax parsedMax = response.getAggregations().get("age-max-aggs");
    21. double maxValue = parsedMax.getValue();
    22. log.info("最大:{}",maxValue);
    23. }

    5.  stats

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-stats-aggs": {
    7. "stats": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void statsAgeQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.stats("age-stats-aggs").field("age"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedStats parsedStats = response.getAggregations().get("age-stats-aggs");
    21. double avg = parsedStats.getAvg();
    22. double max = parsedStats.getMax();
    23. double min = parsedStats.getMin();
    24. double sum = parsedStats.getSum();
    25. long count = parsedStats.getCount();
    26. log.info("avg:{},max:{},min:{},sum:{},count:{}",avg,max,min,sum,count);
    27. }

    6. extended_stats

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "age-extended-stats-aggs": {
    7. "extended_stats": {
    8. "field": "age"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void extendedStatsAgeQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.extendedStats("age-extended-stats-aggs").field("age"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedExtendedStats parsedStats = response.getAggregations().get("age-extended-stats-aggs");
    21. double avg = parsedStats.getAvg();
    22. double max = parsedStats.getMax();
    23. double min = parsedStats.getMin();
    24. double sum = parsedStats.getSum();
    25. long count = parsedStats.getCount();
    26. double stdDeviation = parsedStats.getStdDeviation();
    27. double stdDeviationPopulation = parsedStats.getStdDeviationPopulation();
    28. double stdDeviationSampling = parsedStats.getStdDeviationSampling();
    29. double sumOfSquares = parsedStats.getSumOfSquares();
    30. log.info("avg:{},max:{},min:{},sum:{},count:{},\ndeviation:{},population:{},sampling:{},squares:{}",
    31. avg,max,min,sum,count,stdDeviation,stdDeviationPopulation,stdDeviationSampling,sumOfSquares);
    32. }

    7. filter 

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "filter-aggs": {
    7. "filter": {
    8. "match":{
    9. "name":"不"
    10. }
    11. }
    12. }
    13. }
    14. }*/
    15. @Test
    16. void filterAggsQuery() throws IOException {
    17. SearchRequest searchRequest = new SearchRequest("user");
    18. SearchSourceBuilder builder = new SearchSourceBuilder();
    19. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "不");
    20. builder.aggregation(AggregationBuilders.filter("filter-aggs",matchQueryBuilder));
    21. searchRequest.source(builder);
    22. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    23. ParsedFilter parsedFilter = response.getAggregations().get("filter-aggs");
    24. long docCount = parsedFilter.getDocCount();
    25. log.info("doc-count:{}",docCount);
    26. }

    8. filters

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "filters-aggs": {
    7. "filters": {
    8. "filters": {
    9. "dog-yellow": {
    10. "nested": {
    11. "path": "dog",
    12. "query": {
    13. "match": {
    14. "dog.color": "yellow"
    15. }
    16. }
    17. }
    18. },
    19. "dog-red": {
    20. "nested": {
    21. "path": "dog",
    22. "query": {
    23. "match": {
    24. "dog.color": "red"
    25. }
    26. }
    27. }
    28. }
    29. }
    30. }
    31. }
    32. }
    33. }*/
    34. @Test
    35. void filtersAggsQuery() throws IOException {
    36. SearchRequest searchRequest = new SearchRequest("user");
    37. SearchSourceBuilder builder = new SearchSourceBuilder();
    38. NestedQueryBuilder redBuilder = QueryBuilders.nestedQuery("dog", QueryBuilders.matchQuery("dog.color", "red"), ScoreMode.None);
    39. FiltersAggregator.KeyedFilter keyedRedFilter = new FiltersAggregator.KeyedFilter("dog-red",redBuilder);
    40. NestedQueryBuilder yellowBuilder = QueryBuilders.nestedQuery("dog", QueryBuilders.matchQuery("dog.color", "yellow"), ScoreMode.None);
    41. FiltersAggregator.KeyedFilter keyedYellowFilter = new FiltersAggregator.KeyedFilter("dog-yellow",yellowBuilder);
    42. builder.aggregation(AggregationBuilders.filters("filters-aggs",keyedRedFilter,keyedYellowFilter));
    43. searchRequest.source(builder);
    44. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    45. ParsedFilters parsedFilters = response.getAggregations().get("filters-aggs");
    46. ParsedFilters.ParsedBucket dogRedBucket = parsedFilters.getBucketByKey("dog-red");
    47. ParsedFilters.ParsedBucket dogYellowBucket = parsedFilters.getBucketByKey("dog-yellow");
    48. log.info("yellow:{},doc-count:{}",dogYellowBucket.getKeyAsString(),dogYellowBucket.getDocCount());
    49. log.info("red:{},doc-count:{}",dogRedBucket.getKeyAsString(),dogRedBucket.getDocCount());
    50. }

    9. terms

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "terms-aggs": {
    7. "terms": {
    8. "field": "birthday"
    9. }
    10. }
    11. }
    12. }*/
    13. @Test
    14. void termsAggsQuery() throws IOException {
    15. SearchRequest searchRequest = new SearchRequest("user");
    16. SearchSourceBuilder builder = new SearchSourceBuilder();
    17. builder.aggregation(AggregationBuilders.terms("terms-aggs").field("birthday"));
    18. searchRequest.source(builder);
    19. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    20. ParsedLongTerms parsedLongTerms = response.getAggregations().get("terms-aggs");
    21. for (Terms.Bucket bucket : parsedLongTerms.getBuckets()) {
    22. String keyAsString = bucket.getKeyAsString();
    23. long docCount = bucket.getDocCount();
    24. log.info("{}:{}",keyAsString,docCount);
    25. }
    26. }

    10.  range

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "range-aggs": {
    7. "range": {
    8. "field": "age",
    9. "ranges": [
    10. {
    11. "from": 0,
    12. "to": 20
    13. },
    14. {
    15. "from": 20,
    16. "to": 60
    17. },
    18. {
    19. "from": 60,
    20. "to": 100
    21. }
    22. ]
    23. }
    24. }
    25. }
    26. }*/
    27. @Test
    28. void rangeAggsQuery() throws IOException {
    29. SearchRequest searchRequest = new SearchRequest("user");
    30. SearchSourceBuilder builder = new SearchSourceBuilder();
    31. builder.aggregation(AggregationBuilders.range("range-aggs").field("age")
    32. .addRange(0,20).addRange(20,60).addRange(60,100));
    33. searchRequest.source(builder);
    34. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    35. ParsedRange parsedRange = response.getAggregations().get("range-aggs");
    36. for (Range.Bucket bucket : parsedRange.getBuckets()) {
    37. String keyAsString = bucket.getKeyAsString();
    38. long docCount = bucket.getDocCount();
    39. log.info("{}:{}",keyAsString,docCount);
    40. }
    41. }

    11. date_range

    1. /**
    2. GET /user/_search
    3. {
    4. "size": 0,
    5. "aggs": {
    6. "date-rang-aggs": {
    7. "date_range": {
    8. "field": "birthday",
    9. "ranges": [
    10. {
    11. "from": "1992-01-01",
    12. "to": "1994-01-01"
    13. },
    14. {
    15. "from": "1994-01-01",
    16. "to": "1999-01-01"
    17. },
    18. {
    19. "from": "1999-01-01",
    20. "to": "2022-01-01"
    21. }
    22. ]
    23. }
    24. }
    25. }
    26. }*/
    27. @Test
    28. void dateRangeAggsQuery() throws IOException {
    29. SearchRequest searchRequest = new SearchRequest("user");
    30. SearchSourceBuilder builder = new SearchSourceBuilder();
    31. builder.aggregation(AggregationBuilders.dateRange("date-range-aggs").field("birthday")
    32. .addRange("1992-01-01","1994-01-01").addRange("1994-01-01","1999-01-01").addRange("1999-01-01","2022-01-01"));
    33. searchRequest.source(builder);
    34. SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    35. ParsedDateRange parsedDateRange = response.getAggregations().get("date-range-aggs");
    36. for (Range.Bucket bucket : parsedDateRange.getBuckets()) {
    37. String keyAsString = bucket.getKeyAsString();
    38. long docCount = bucket.getDocCount();
    39. log.info("{}:{}",keyAsString,docCount);
    40. }
    41. }

    七、总结

    Elasticsearch 在springboot中的相关操作就介绍这么多了,应该都够用了,哈哈哈

  • 相关阅读:
    架构核心技术之分布式消息队列
    AFUDOS命令
    JavaScript游戏开发(1)(笔记)
    浅谈微机综合自动化系统在化工企业变电站中应用
    centos7创建ramdisk
    02-HotSpot 虚拟机对象探秘
    大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品
    工程(十三)——基于激光视觉的SLAM三维重建
    如何实现自动化测试?
    nms非极大抑制
  • 原文地址:https://blog.csdn.net/axibazZ/article/details/126817585