Elasticsearch 入门实战(9)--Java API Client 使用二

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

本文继续上文(Elasticsearch 入门实战(5)--Java API Client 使用一(Index,Document,Ingest,SQL APIs))先容 Java API Client,相关的情况及软件信息如下:CentOS 7.6.1810、Java 1.8.0_341(客户端用)、Elasticsearch 8.13.4、elasticsearch-java 8.13.4。
1、Search APIs

1.1、Count API(查询文档数量)
  1. /**
  2. * 查询文档数量
  3. */
  4. @Test
  5. public void count() throws IOException {
  6.     //查询该索引的所有文档数量
  7.     CountResponse response = client.count(builder -> builder.index(INDEX_NAME));
  8.     log.info("response={}", response);
  9.     //通过 Lucene 查询语法指定条件;8.13.4会报错”contains unrecognized parameter: [q]“,因为 API 提交了请求 "{}",应该时不需要请求体
  10.     //response = client.count(builder -> builder.index(INDEX_NAME).q("name:杜甫"));
  11.     log.info("response={}", response);
  12.     //通过 "Query DSL" 指定条件
  13.     response = client.count(builder -> builder
  14.             .index(INDEX_NAME)
  15.             .query(queryBuilder -> queryBuilder
  16.                     .term(termQueryBuilder -> termQueryBuilder
  17.                             .field("name").value("杜甫")
  18.                     )
  19.             )
  20.     );
  21.     log.info("response={}", response);
  22. }
复制代码
1.2、Search API(查询文档)

1.2.1、query

1.2.1.1、term/terms 查询
  1. /**
  2. * term/terms 查询,对输入内容不做分词处理
  3. */
  4. @Test
  5. public void searchTerm() throws IOException {
  6.     SearchResponse<Map> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .term(termQueryBuilder -> termQueryBuilder
  10.                                     .field("name").value("李白")))
  11.                     .sort(sortOptionsBuilder -> sortOptionsBuilder
  12.                             .field(fieldSortBuilder -> fieldSortBuilder
  13.                                     .field("age").order(SortOrder.Asc)))
  14.                     .source(sourceConfigBuilder -> sourceConfigBuilder
  15.                             .filter(sourceFilterBuilder -> sourceFilterBuilder
  16.                                     .includes("age", "name")))
  17.                     .from(0)
  18.                     .size(10)
  19.             , Map.class);
  20.     log.info("response={}", response);
  21.     List<FieldValue> words = new ArrayList<>();
  22.     words.add(new FieldValue.Builder().stringValue("李白").build());
  23.     words.add(new FieldValue.Builder().stringValue("杜甫").build());
  24.     SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  25.                     .index(INDEX_NAME)
  26.                     .query(queryBuilder -> queryBuilder
  27.                             .terms(termsQueryBuilder -> termsQueryBuilder
  28.                                     .field("name").terms(termsQueryFieldBuilder -> termsQueryFieldBuilder.value(words))))
  29.                     .source(sourceConfigBuilder -> sourceConfigBuilder
  30.                             .filter(sourceFilterBuilder -> sourceFilterBuilder
  31.                                     .excludes("about")))
  32.                     .from(0)
  33.                     .size(10)
  34.             , Poet.class);
  35.     log.info("response2={}", response2);
  36. }
复制代码
1.2.1.2、range 查询
  1. /**
  2. * range 查询,范围查询
  3. */
  4. @Test
  5. public void searchRange() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .range(rangeQueryBuilder -> rangeQueryBuilder
  10.                                     .field("age").gte(JsonData.of("20")).lt(JsonData.of("40"))))
  11.             , Poet.class);
  12.     log.info("response={}", response);
  13. }
复制代码
1.2.1.3、exists 查询
  1. /**
  2. * exists 查询,查询对应字段不为空的数据
  3. */
  4. @Test
  5. public void exists() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME).query(builder -> builder.exists(builder1 -> builder1.field("poems")))
  8.             , Poet.class);
  9.     log.info("response={}", response);
  10. }
复制代码
1.2.1.4、match 相关查询

A、match
  1. /**
  2. * match查询,对输入内容先分词再查询
  3. */
  4. @Test
  5. public void searchMatch() throws IOException {
  6.     SearchResponse<Map> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .match(matchQueryBuilder -> matchQueryBuilder
  10.                                     .field("success").query("思想")))
  11.             , Map.class);
  12.     log.info("response={}", response);
  13. }
复制代码
B、multi_match
  1. /**
  2. * multi_match 查询,多个字段进行匹配。
  3. */
  4. @Test
  5. public void searchMultiMatch() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .multiMatch(multiMatchQueryBuilder -> multiMatchQueryBuilder
  10.                                     .fields("about", "success").query("思想")))
  11.             , Poet.class);
  12.     log.info("response={}", response);
  13. }
复制代码
C、match_phrase
  1. /**
  2. * match_phrase 查询,类似 match,先把查询字符串分词生成一个词列表,查询包含所有这些词且这些词在文档中出现次序一致的数据。
  3. */
  4. @Test
  5. public void searchMatchPhrase() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .matchPhrase(matchPhraseQueryBuilder -> matchPhraseQueryBuilder
  10.                                     .field("success").query("伟大作家")))
  11.             , Poet.class);
  12.     log.info("response={}", response);
  13. }
复制代码
D、match_all
  1. /**
  2. * match_all 查询,查询所有文档
  3. */
  4. @Test
  5. public void searchMatchAll() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .matchAll(matchAllQueryBuilder -> matchAllQueryBuilder))
  10.             , Poet.class);
  11.     log.info("response={}", response);
  12.     //不加请求体,也是一样的效果,查询所有文档。
  13.     response = client.search(searchRequestBuilder -> searchRequestBuilder.index(INDEX_NAME), Poet.class);
  14.     log.info("response={}", response);
  15. }
复制代码
E、match_none
  1. /**
  2. * match_none 查询,与 match_all 相反,返回 0 个文档。
  3. */
  4. @Test
  5. public void searchMatchNone() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .matchNone(matchAllQueryBuilder -> matchAllQueryBuilder))
  10.             , Poet.class);
  11.     log.info("response={}", response);
  12. }
复制代码
1.2.1.5、query_string 查询
  1. /**
  2. * query_string 查询,可以同时实现多种查询
  3. */
  4. @Test
  5. public void searchQueryString() throws IOException {
  6.     //类似 match
  7.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  8.                     .index(INDEX_NAME)
  9.                     .query(queryBuilder -> queryBuilder
  10.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  11.                                     .defaultField("success").query("古典文学")))
  12.             , Poet.class);
  13.     log.info("response={}", response);
  14.     //类似 mulit_match
  15.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  16.                     .index(INDEX_NAME)
  17.                     .query(queryBuilder -> queryBuilder
  18.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  19.                                     .fields("about", "success").query("古典文学")))
  20.             , Poet.class);
  21.     log.info("response={}", response);
  22.     //类似 match_phrase
  23.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  24.                     .index(INDEX_NAME)
  25.                     .query(queryBuilder -> queryBuilder
  26.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  27.                                     .defaultField("success").query(""文学作家"")))
  28.             , Poet.class);
  29.     log.info(response.toString());
  30.     //带运算符查询,运算符两边的词不再分词
  31.     //查询同时包含 ”文学“ 和 ”伟大“ 的文档
  32.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  33.                     .index(INDEX_NAME)
  34.                     .query(queryBuilder -> queryBuilder
  35.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  36.                                     .fields("success").query("文学 AND 伟大")))
  37.             , Poet.class);
  38.     log.info("response={}", response);
  39.     //等同上一个查询
  40.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  41.                     .index(INDEX_NAME)
  42.                     .query(queryBuilder -> queryBuilder
  43.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  44.                                     .fields("success").query("文学 伟大").defaultOperator(Operator.And)))
  45.             , Poet.class);
  46.     log.info("response={}", response);
  47.     //查询 name 或 success 字段包含"文学"和"伟大"这两个单词,或者包含"李白"这个单词的文档。
  48.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  49.                     .index(INDEX_NAME)
  50.                     .query(queryBuilder -> queryBuilder
  51.                             .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  52.                                     .fields("name","success").query("(文学 AND 伟大) OR 高度")))
  53.             , Poet.class);
  54.     log.info("response={}", response);
  55. }
复制代码
1.2.1.6、simple_query_string 查询
  1. /**
  2. * simple_query_string 查询,类似 query_string,主要区别如下:
  3. * 1、不支持 AND OR NOT,会当做字符处理;使用 + 代替 AND,| 代替 OR,- 代替 NOT
  4. * 2、会忽略错误的语法
  5. */
  6. @Test
  7. public void searchSimpleQueryString() throws IOException {
  8.     //查询同时包含 ”文学“ 和 ”伟大“ 的文档
  9.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  10.                     .index(INDEX_NAME)
  11.                     .query(queryBuilder -> queryBuilder
  12.                             .simpleQueryString(simpleQueryStringQueryBuilder -> simpleQueryStringQueryBuilder
  13.                                     .fields("success").query("文学 + 伟大")))
  14.             , Poet.class);
  15.     log.info("response={}", response);
  16. }
复制代码
3.4.7、fuzzy 查询
  1. /**
  2. * 模糊查询
  3. */
  4. @Test
  5. public void searchFuzzy() throws IOException {
  6.     //全文查询时使用模糊参数,先分词再计算模糊选项。
  7.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  8.                     .index(INDEX_NAME)
  9.                     .query(queryBuilder -> queryBuilder
  10.                             .match(matchQueryBuilder -> matchQueryBuilder
  11.                                     .field("success").query("思考").fuzziness("1")))
  12.             , Poet.class);
  13.     log.info(response.toString());
  14.     //使用 fuzzy query,对输入不分词,直接计算模糊选项。
  15.     SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  16.                     .index(INDEX_NAME)
  17.                     .query(queryBuilder -> queryBuilder
  18.                             .fuzzy(fuzzyQueryBuilder ->  fuzzyQueryBuilder
  19.                                     .field("success").fuzziness("1").value("理想")))
  20.             , Poet.class);
  21.     log.info(response2.toString());
  22. }
复制代码
1.2.1.8、wildcard 查询
  1. /**
  2. * wildcard 查询,类似 SQL 语句中的 like;? 匹配一个字符,* 匹配多个字符
  3. */
  4. @Test
  5. public void searchWildcard() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.             .index(INDEX_NAME)
  8.             .query(queryBuilder -> queryBuilder.wildcard(wildcardQueryBuilder -> wildcardQueryBuilder
  9.                     .field("name")
  10.                     .wildcard("李*")))
  11.             , Poet.class);
  12.     log.info(response.toString());
  13. }
复制代码
1.2.1.9、bool 查询
  1. /**
  2. * bool 查询,组合查询
  3. */
  4. @Test
  5. public void searchBool() throws IOException {
  6.     //查询 success 包含 “思想” 且 age 在 [20-40] 之间的文档
  7.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  8.                     .index(INDEX_NAME)
  9.                     .query(queryBuilder -> queryBuilder
  10.                             .bool(boolQueryBuilder -> boolQueryBuilder
  11.                                     .must(queryBuilder2 -> queryBuilder2
  12.                                             .match(matchQueryBuilder -> matchQueryBuilder
  13.                                                     .field("success").query("思想"))
  14.                                     )
  15.                                     .must(queryBuilder2 -> queryBuilder2
  16.                                             .range(rangeQueryBuilder -> rangeQueryBuilder
  17.                                                     .field("age").gte(JsonData.of("20")).lt(JsonData.of("40")))
  18.                                     )
  19.                             )
  20.                     )
  21.             , Poet.class);
  22.     log.info(response.toString());
  23.     //过滤出 success 包含 “思想” 且 age 在 [20-40] 之间的文档,不计算得分
  24.     SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  25.                     .index(INDEX_NAME)
  26.                     .query(queryBuilder -> queryBuilder
  27.                             .bool(boolQueryBuilder -> boolQueryBuilder
  28.                                     .filter(queryBuilder2 -> queryBuilder2
  29.                                             .match(matchQueryBuilder -> matchQueryBuilder
  30.                                                     .field("success").query("思想"))
  31.                                     )
  32.                                     .filter(queryBuilder2 -> queryBuilder2
  33.                                             .range(rangeQueryBuilder -> rangeQueryBuilder
  34.                                                     .field("age").gte(JsonData.of("20")).lt(JsonData.of("40")))
  35.                                     )
  36.                             )
  37.                     )
  38.             , Poet.class);
  39.     log.info(response2.toString());
  40. }
复制代码
1.2.2、aggs 查询
  1. /**
  2. * aggs 查询,聚合查询
  3. */
  4. @Test
  5. public void searchAggs() throws IOException {
  6.     //求和,类似 select sum(age) from poet-index
  7.     SearchResponse response = client.search(searchRequestBuilder -> searchRequestBuilder
  8.                     .index(INDEX_NAME)
  9.                     .aggregations("age_sum", aggregationBuilder -> aggregationBuilder
  10.                             .sum(sumAggregationBuilder -> sumAggregationBuilder
  11.                                     .field("age")))
  12.             , Poet.class);
  13.     log.info(response.toString());
  14.     //类似 select count distinct(age) from poet-index
  15.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  16.                     .index(INDEX_NAME)
  17.                     .aggregations("age_count", aggregationBuilder -> aggregationBuilder
  18.                             .cardinality(cardinalityAggregationBuilder -> cardinalityAggregationBuilder.field("age")))
  19.             , Poet.class);
  20.     log.info(response.toString());
  21.     //数量、最大、最小、平均、求和
  22.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  23.                     .index(INDEX_NAME)
  24.                     .aggregations("age_stats", aggregationBuilder -> aggregationBuilder
  25.                             .stats(statsAggregationBuilder -> statsAggregationBuilder
  26.                                     .field("age")))
  27.             , Poet.class);
  28.     log.info(response.toString());
  29.     //select name,count(*) from poet-index group by name
  30.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  31.                     .index(INDEX_NAME)
  32.                     .aggregations("name_terms", aggregationBuilder -> aggregationBuilder
  33.                             .terms(termsAggregationBuilder -> termsAggregationBuilder
  34.                                     .field("name")))
  35.             , Map.class);
  36.     log.info(response.toString());
  37.     //select name,age,count(*) from poet-index group by name,age
  38.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  39.                     .index(INDEX_NAME)
  40.                     .aggregations("name_terms", aggregationBuilder -> aggregationBuilder
  41.                             .terms(termsAggregationBuilder -> termsAggregationBuilder
  42.                                     .field("name")
  43.                             )
  44.                             .aggregations("age_terms", aggregationBuilder2 -> aggregationBuilder2
  45.                                     .terms(termsAggregationBuilder -> termsAggregationBuilder
  46.                                             .field("age")
  47.                                     ))
  48.                     )
  49.             , Poet.class);
  50.     log.info(response.toString());
  51.     //类似 select avg(age) from poet-index where name='李白'
  52.     response = client.search(searchRequestBuilder -> searchRequestBuilder
  53.                     .index(INDEX_NAME)
  54.                     .query(queryBuilder -> queryBuilder
  55.                             .bool(boolQueryBuilder -> boolQueryBuilder
  56.                                     .filter(queryBuilder2 -> queryBuilder2
  57.                                             .term(termQueryBuilder -> termQueryBuilder
  58.                                                     .field("name").value("李白")))))
  59.                     .aggregations("ave_age", aggregationBuilder -> aggregationBuilder
  60.                             .avg(averageAggregationBuilder -> averageAggregationBuilder.field("age")))
  61.             , Poet.class);
  62.     log.info(response.toString());
  63. }
复制代码
1.2.3、suggest 查询
  1. /**
  2. * suggest 查询,推荐查询
  3. */
  4. @Test
  5. public void searchSuggest() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .suggest(suggesterBuilder -> suggesterBuilder
  9.                             .suggesters("success_suggest", fieldSuggesterBuilder -> fieldSuggesterBuilder
  10.                                     .text("思考")
  11.                                     .term(termSuggesterBuilder -> termSuggesterBuilder
  12.                                             .field("success")
  13.                                             .suggestMode(SuggestMode.Always)
  14.                                             .minWordLength(2)
  15.                                     )
  16.                             )
  17.                     )
  18.             , Poet.class);
  19.     log.info(response.toString());
  20. }
复制代码
1.2.4、highlight
  1. /**
  2. * 高亮显示
  3. */
  4. @Test
  5. public void searchHighlight() throws IOException {
  6.     SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  7.                     .index(INDEX_NAME)
  8.                     .query(queryBuilder -> queryBuilder
  9.                             .match(matchQueryBuilder -> matchQueryBuilder
  10.                                     .field("success").query("思想")))
  11.                     .highlight(highlightBuilder -> highlightBuilder
  12.                             .preTags("<span color='red'>")
  13.                             .postTags("</span>")
  14.                             .fields("success", highlightFieldBuilder -> highlightFieldBuilder))
  15.             , Poet.class);
  16.     log.info(response.toString());
  17. }
复制代码
2、完整代码

  1. package com.abc.demo.es;
  2. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  3. import co.elastic.clients.elasticsearch._types.FieldValue;
  4. import co.elastic.clients.elasticsearch._types.SortOrder;
  5. import co.elastic.clients.elasticsearch._types.SuggestMode;
  6. import co.elastic.clients.elasticsearch._types.query_dsl.Operator;
  7. import co.elastic.clients.elasticsearch.core.*;
  8. import co.elastic.clients.json.JsonData;
  9. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  10. import co.elastic.clients.transport.ElasticsearchTransport;
  11. import co.elastic.clients.transport.rest_client.RestClientTransport;
  12. import com.fasterxml.jackson.databind.ObjectMapper;
  13. import lombok.AllArgsConstructor;
  14. import lombok.Data;
  15. import lombok.NoArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.apache.http.HttpHost;
  18. import org.elasticsearch.client.RestClient;
  19. import org.junit.After;
  20. import org.junit.Before;
  21. import org.junit.Test;
  22. import java.io.IOException;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. import java.util.Map;
  26. @Slf4j
  27. public class ElasticsearchJavaCase2 {
  28.     private static final String INDEX_NAME = "poet-index";
  29.     private ElasticsearchTransport transport;
  30.     private ElasticsearchClient client;
  31.     @Before
  32.     public void before() {
  33.         RestClient restClient = RestClient.builder(
  34.                 new HttpHost("10.49.196.10", 9200),
  35.                 new HttpHost("10.49.196.11", 9200),
  36.                 new HttpHost("10.49.196.12", 9200)).build();
  37.         ObjectMapper objectMapper = new ObjectMapper();
  38.         transport = new RestClientTransport(restClient, new JacksonJsonpMapper(objectMapper));
  39.         client = new ElasticsearchClient(transport);
  40.     }
  41.     @After
  42.     public void after() throws IOException {
  43.         transport.close();
  44.     }
  45.     /**
  46.      * 查询文档数量
  47.      */
  48.     @Test
  49.     public void count() throws IOException {
  50.         //查询该索引的所有文档数量
  51.         CountResponse response = client.count(builder -> builder.index(INDEX_NAME));
  52.         log.info("response={}", response);
  53.         //通过 Lucene 查询语法指定条件;8.13.4会报错”contains unrecognized parameter: [q]“,因为 API 提交了请求 "{}",应该时不需要请求体
  54.         //response = client.count(builder -> builder.index(INDEX_NAME).q("name:杜甫"));
  55.         log.info("response={}", response);
  56.         //通过 "Query DSL" 指定条件
  57.         response = client.count(builder -> builder
  58.                 .index(INDEX_NAME)
  59.                 .query(queryBuilder -> queryBuilder
  60.                         .term(termQueryBuilder -> termQueryBuilder
  61.                                 .field("name").value("杜甫")
  62.                         )
  63.                 )
  64.         );
  65.         log.info("response={}", response);
  66.     }
  67.     /**
  68.      * term/terms查询,对输入内容不做分词处理
  69.      */
  70.     @Test
  71.     public void searchTerm() throws IOException {
  72.         SearchResponse<Map> response = client.search(searchRequestBuilder -> searchRequestBuilder
  73.                         .index(INDEX_NAME)
  74.                         .query(queryBuilder -> queryBuilder
  75.                                 .term(termQueryBuilder -> termQueryBuilder
  76.                                         .field("name").value("李白")))
  77.                         .sort(sortOptionsBuilder -> sortOptionsBuilder
  78.                                 .field(fieldSortBuilder -> fieldSortBuilder
  79.                                         .field("age").order(SortOrder.Asc)))
  80.                         .source(sourceConfigBuilder -> sourceConfigBuilder
  81.                                 .filter(sourceFilterBuilder -> sourceFilterBuilder
  82.                                         .includes("age", "name")))
  83.                         .from(0)
  84.                         .size(10)
  85.                 , Map.class);
  86.         log.info("response={}", response);
  87.         List<FieldValue> words = new ArrayList<>();
  88.         words.add(new FieldValue.Builder().stringValue("李白").build());
  89.         words.add(new FieldValue.Builder().stringValue("杜甫").build());
  90.         SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  91.                         .index(INDEX_NAME)
  92.                         .query(queryBuilder -> queryBuilder
  93.                                 .terms(termsQueryBuilder -> termsQueryBuilder
  94.                                         .field("name").terms(termsQueryFieldBuilder -> termsQueryFieldBuilder.value(words))))
  95.                         .source(sourceConfigBuilder -> sourceConfigBuilder
  96.                                 .filter(sourceFilterBuilder -> sourceFilterBuilder
  97.                                         .excludes("about")))
  98.                         .from(0)
  99.                         .size(10)
  100.                 , Poet.class);
  101.         log.info("response2={}", response2);
  102.     }
  103.     /**
  104.      * range(范围)查询
  105.      */
  106.     @Test
  107.     public void searchRange() throws IOException {
  108.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  109.                         .index(INDEX_NAME)
  110.                         .query(queryBuilder -> queryBuilder
  111.                                 .range(rangeQueryBuilder -> rangeQueryBuilder
  112.                                         .field("age").gte(JsonData.of("20")).lt(JsonData.of("40"))))
  113.                 , Poet.class);
  114.         log.info("response={}", response);
  115.     }
  116.     /**
  117.      * exists 查询,查询对应字段不为空的数据
  118.      */
  119.     @Test
  120.     public void exists() throws IOException {
  121.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  122.                         .index(INDEX_NAME).query(builder -> builder.exists(builder1 -> builder1.field("poems")))
  123.                 , Poet.class);
  124.         log.info("response={}", response);
  125.     }
  126.     /**
  127.      * match查询,对输入内容先分词再查询
  128.      */
  129.     @Test
  130.     public void searchMatch() throws IOException {
  131.         SearchResponse<Map> response = client.search(searchRequestBuilder -> searchRequestBuilder
  132.                         .index(INDEX_NAME)
  133.                         .query(queryBuilder -> queryBuilder
  134.                                 .match(matchQueryBuilder -> matchQueryBuilder
  135.                                         .field("success").query("思想")))
  136.                 , Map.class);
  137.         log.info("response={}", response);
  138.     }
  139.     /**
  140.      * multi_match 查询,多个字段进行匹配。
  141.      */
  142.     @Test
  143.     public void searchMultiMatch() throws IOException {
  144.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  145.                         .index(INDEX_NAME)
  146.                         .query(queryBuilder -> queryBuilder
  147.                                 .multiMatch(multiMatchQueryBuilder -> multiMatchQueryBuilder
  148.                                         .fields("about", "success").query("思想")))
  149.                 , Poet.class);
  150.         log.info("response={}", response);
  151.     }
  152.     /**
  153.      * match_phrase 查询,类似 match,先把查询字符串分词生成一个词列表,查询包含所有这些词且这些词在文档中出现次序一致的数据。
  154.      */
  155.     @Test
  156.     public void searchMatchPhrase() throws IOException {
  157.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  158.                         .index(INDEX_NAME)
  159.                         .query(queryBuilder -> queryBuilder
  160.                                 .matchPhrase(matchPhraseQueryBuilder -> matchPhraseQueryBuilder
  161.                                         .field("success").query("伟大作家")))
  162.                 , Poet.class);
  163.         log.info("response={}", response);
  164.     }
  165.     /**
  166.      * match_all 查询,查询所有文档
  167.      */
  168.     @Test
  169.     public void searchMatchAll() throws IOException {
  170.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  171.                         .index(INDEX_NAME)
  172.                         .query(queryBuilder -> queryBuilder
  173.                                 .matchAll(matchAllQueryBuilder -> matchAllQueryBuilder))
  174.                 , Poet.class);
  175.         log.info("response={}", response);
  176.         //不加请求体,也是一样的效果,查询所有文档。
  177.         response = client.search(searchRequestBuilder -> searchRequestBuilder.index(INDEX_NAME), Poet.class);
  178.         log.info("response={}", response);
  179.     }
  180.     /**
  181.      * match_none 查询,与 match_all 相反,返回 0 个文档。
  182.      */
  183.     @Test
  184.     public void searchMatchNone() throws IOException {
  185.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  186.                         .index(INDEX_NAME)
  187.                         .query(queryBuilder -> queryBuilder
  188.                                 .matchNone(matchAllQueryBuilder -> matchAllQueryBuilder))
  189.                 , Poet.class);
  190.         log.info("response={}", response);
  191.     }
  192.     /**
  193.      * query_string 查询,可以同时实现多种查询
  194.      */
  195.     @Test
  196.     public void searchQueryString() throws IOException {
  197.         //类似 match
  198.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  199.                         .index(INDEX_NAME)
  200.                         .query(queryBuilder -> queryBuilder
  201.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  202.                                         .defaultField("success").query("古典文学")))
  203.                 , Poet.class);
  204.         log.info("response={}", response);
  205.         //类似 mulit_match
  206.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  207.                         .index(INDEX_NAME)
  208.                         .query(queryBuilder -> queryBuilder
  209.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  210.                                         .fields("about", "success").query("古典文学")))
  211.                 , Poet.class);
  212.         log.info("response={}", response);
  213.         //类似 match_phrase
  214.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  215.                         .index(INDEX_NAME)
  216.                         .query(queryBuilder -> queryBuilder
  217.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  218.                                         .defaultField("success").query(""文学作家"")))
  219.                 , Poet.class);
  220.         log.info(response.toString());
  221.         //带运算符查询,运算符两边的词不再分词
  222.         //查询同时包含 ”文学“ 和 ”伟大“ 的文档
  223.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  224.                         .index(INDEX_NAME)
  225.                         .query(queryBuilder -> queryBuilder
  226.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  227.                                         .fields("success").query("文学 AND 伟大")))
  228.                 , Poet.class);
  229.         log.info("response={}", response);
  230.         //等同上一个查询
  231.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  232.                         .index(INDEX_NAME)
  233.                         .query(queryBuilder -> queryBuilder
  234.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  235.                                         .fields("success").query("文学 伟大").defaultOperator(Operator.And)))
  236.                 , Poet.class);
  237.         log.info("response={}", response);
  238.         //查询 name 或 success 字段包含"文学"和"伟大"这两个单词,或者包含"李白"这个单词的文档。
  239.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  240.                         .index(INDEX_NAME)
  241.                         .query(queryBuilder -> queryBuilder
  242.                                 .queryString(queryStringQueryBuilder -> queryStringQueryBuilder
  243.                                         .fields("name","success").query("(文学 AND 伟大) OR 高度")))
  244.                 , Poet.class);
  245.         log.info("response={}", response);
  246.     }
  247.     /**
  248.      * simple_query_string 查询,类似 query_string,主要区别如下:
  249.      * 1、不支持 AND OR NOT,会当做字符处理;使用 + 代替 AND,| 代替 OR,- 代替 NOT
  250.      * 2、会忽略错误的语法
  251.      */
  252.     @Test
  253.     public void searchSimpleQueryString() throws IOException {
  254.         //查询同时包含 ”文学“ 和 ”伟大“ 的文档
  255.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  256.                         .index(INDEX_NAME)
  257.                         .query(queryBuilder -> queryBuilder
  258.                                 .simpleQueryString(simpleQueryStringQueryBuilder -> simpleQueryStringQueryBuilder
  259.                                         .fields("success").query("文学 + 伟大")))
  260.                 , Poet.class);
  261.         log.info("response={}", response);
  262.     }
  263.     /**
  264.      * 模糊查询
  265.      */
  266.     @Test
  267.     public void searchFuzzy() throws IOException {
  268.         //全文查询时使用模糊参数,先分词再计算模糊选项。
  269.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  270.                         .index(INDEX_NAME)
  271.                         .query(queryBuilder -> queryBuilder
  272.                                 .match(matchQueryBuilder -> matchQueryBuilder
  273.                                         .field("success").query("思考").fuzziness("1")))
  274.                 , Poet.class);
  275.         log.info(response.toString());
  276.         //使用 fuzzy query,对输入不分词,直接计算模糊选项。
  277.         SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  278.                         .index(INDEX_NAME)
  279.                         .query(queryBuilder -> queryBuilder
  280.                                 .fuzzy(fuzzyQueryBuilder ->  fuzzyQueryBuilder
  281.                                         .field("success").fuzziness("1").value("理想")))
  282.                 , Poet.class);
  283.         log.info(response2.toString());
  284.     }
  285.     /**
  286.      * wildcard 查询,类似 SQL 语句中的 like;? 匹配一个字符,* 匹配多个字符
  287.      */
  288.     @Test
  289.     public void searchWildcard() throws IOException {
  290.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  291.                 .index(INDEX_NAME)
  292.                 .query(queryBuilder -> queryBuilder.wildcard(wildcardQueryBuilder -> wildcardQueryBuilder
  293.                         .field("name")
  294.                         .wildcard("李*")))
  295.                 , Poet.class);
  296.         log.info(response.toString());
  297.     }
  298.     /**
  299.      * bool 查询,组合查询
  300.      */
  301.     @Test
  302.     public void searchBool() throws IOException {
  303.         //查询 success 包含 “思想” 且 age 在 [20-40] 之间的文档
  304.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  305.                         .index(INDEX_NAME)
  306.                         .query(queryBuilder -> queryBuilder
  307.                                 .bool(boolQueryBuilder -> boolQueryBuilder
  308.                                         .must(queryBuilder2 -> queryBuilder2
  309.                                                 .match(matchQueryBuilder -> matchQueryBuilder
  310.                                                         .field("success").query("思想"))
  311.                                         )
  312.                                         .must(queryBuilder2 -> queryBuilder2
  313.                                                 .range(rangeQueryBuilder -> rangeQueryBuilder
  314.                                                         .field("age").gte(JsonData.of("20")).lt(JsonData.of("40")))
  315.                                         )
  316.                                 )
  317.                         )
  318.                 , Poet.class);
  319.         log.info(response.toString());
  320.         //过滤出 success 包含 “思想” 且 age 在 [20-40] 之间的文档,不计算得分
  321.         SearchResponse<Poet> response2 = client.search(searchRequestBuilder -> searchRequestBuilder
  322.                         .index(INDEX_NAME)
  323.                         .query(queryBuilder -> queryBuilder
  324.                                 .bool(boolQueryBuilder -> boolQueryBuilder
  325.                                         .filter(queryBuilder2 -> queryBuilder2
  326.                                                 .match(matchQueryBuilder -> matchQueryBuilder
  327.                                                         .field("success").query("思想"))
  328.                                         )
  329.                                         .filter(queryBuilder2 -> queryBuilder2
  330.                                                 .range(rangeQueryBuilder -> rangeQueryBuilder
  331.                                                         .field("age").gte(JsonData.of("20")).lt(JsonData.of("40")))
  332.                                         )
  333.                                 )
  334.                         )
  335.                 , Poet.class);
  336.         log.info(response2.toString());
  337.     }
  338.     /**
  339.      * aggs 查询,聚合查询
  340.      */
  341.     @Test
  342.     public void searchAggs() throws IOException {
  343.         //求和,类似 select sum(age) from poet-index
  344.         SearchResponse response = client.search(searchRequestBuilder -> searchRequestBuilder
  345.                         .index(INDEX_NAME)
  346.                         .aggregations("age_sum", aggregationBuilder -> aggregationBuilder
  347.                                 .sum(sumAggregationBuilder -> sumAggregationBuilder
  348.                                         .field("age")))
  349.                 , Poet.class);
  350.         log.info(response.toString());
  351.         //类似 select count distinct(age) from poet-index
  352.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  353.                         .index(INDEX_NAME)
  354.                         .aggregations("age_count", aggregationBuilder -> aggregationBuilder
  355.                                 .cardinality(cardinalityAggregationBuilder -> cardinalityAggregationBuilder.field("age")))
  356.                 , Poet.class);
  357.         log.info(response.toString());
  358.         //数量、最大、最小、平均、求和
  359.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  360.                         .index(INDEX_NAME)
  361.                         .aggregations("age_stats", aggregationBuilder -> aggregationBuilder
  362.                                 .stats(statsAggregationBuilder -> statsAggregationBuilder
  363.                                         .field("age")))
  364.                 , Poet.class);
  365.         log.info(response.toString());
  366.         //select name,count(*) from poet-index group by name
  367.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  368.                         .index(INDEX_NAME)
  369.                         .aggregations("name_terms", aggregationBuilder -> aggregationBuilder
  370.                                 .terms(termsAggregationBuilder -> termsAggregationBuilder
  371.                                         .field("name")))
  372.                 , Map.class);
  373.         log.info(response.toString());
  374.         //select name,age,count(*) from poet-index group by name,age
  375.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  376.                         .index(INDEX_NAME)
  377.                         .aggregations("name_terms", aggregationBuilder -> aggregationBuilder
  378.                                 .terms(termsAggregationBuilder -> termsAggregationBuilder
  379.                                         .field("name")
  380.                                 )
  381.                                 .aggregations("age_terms", aggregationBuilder2 -> aggregationBuilder2
  382.                                         .terms(termsAggregationBuilder -> termsAggregationBuilder
  383.                                                 .field("age")
  384.                                         ))
  385.                         )
  386.                 , Poet.class);
  387.         log.info(response.toString());
  388.         //类似 select avg(age) from poet-index where name='李白'
  389.         response = client.search(searchRequestBuilder -> searchRequestBuilder
  390.                         .index(INDEX_NAME)
  391.                         .query(queryBuilder -> queryBuilder
  392.                                 .bool(boolQueryBuilder -> boolQueryBuilder
  393.                                         .filter(queryBuilder2 -> queryBuilder2
  394.                                                 .term(termQueryBuilder -> termQueryBuilder
  395.                                                         .field("name").value("李白")))))
  396.                         .aggregations("ave_age", aggregationBuilder -> aggregationBuilder
  397.                                 .avg(averageAggregationBuilder -> averageAggregationBuilder.field("age")))
  398.                 , Poet.class);
  399.         log.info(response.toString());
  400.     }
  401.     /**
  402.      * suggest 查询,推荐搜索
  403.      */
  404.     @Test
  405.     public void searchSuggest() throws IOException {
  406.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  407.                         .index(INDEX_NAME)
  408.                         .suggest(suggesterBuilder -> suggesterBuilder
  409.                                 .suggesters("success_suggest", fieldSuggesterBuilder -> fieldSuggesterBuilder
  410.                                         .text("思考")
  411.                                         .term(termSuggesterBuilder -> termSuggesterBuilder
  412.                                                 .field("success")
  413.                                                 .suggestMode(SuggestMode.Always)
  414.                                                 .minWordLength(2)
  415.                                         )
  416.                                 )
  417.                         )
  418.                 , Poet.class);
  419.         log.info(response.toString());
  420.     }
  421.     /**
  422.      * 高亮显示
  423.      */
  424.     @Test
  425.     public void searchHighlight() throws IOException {
  426.         SearchResponse<Poet> response = client.search(searchRequestBuilder -> searchRequestBuilder
  427.                         .index(INDEX_NAME)
  428.                         .query(queryBuilder -> queryBuilder
  429.                                 .match(matchQueryBuilder -> matchQueryBuilder
  430.                                         .field("success").query("思想艺术")))
  431.                         .highlight(highlightBuilder -> highlightBuilder
  432.                                 .preTags("<span color='red'>")
  433.                                 .postTags("</span>")
  434.                                 .fields("success", highlightFieldBuilder -> highlightFieldBuilder))
  435.                 , Poet.class);
  436.         log.info(response.toString());
  437.     }
  438.     @Data
  439.     @AllArgsConstructor
  440.     @NoArgsConstructor
  441.     static class Poet {
  442.         private Integer age;
  443.         private String name;
  444.         private String poems;
  445.         private String about;
  446.         /**成就*/
  447.         private String success;
  448.     }
  449. }
复制代码
ElasticsearchJavaCase2.java 
 
具体的 Elasticsearch Java API Client 使用说明,请参考官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表