本次使用的版本是Java High Level REST Client,transport Client已经在7.0废止,8.0完全移除。

1 依赖引入

  1. <!--引入es的坐标-->
  2. <dependency>
  3. <groupId>org.elasticsearch.client</groupId>
  4. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  5. <version>7.4.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.elasticsearch.client</groupId>
  9. <artifactId>elasticsearch-rest-client</artifactId>
  10. <version>7.4.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.elasticsearch</groupId>
  14. <artifactId>elasticsearch</artifactId>
  15. <version>7.4.0</version>
  16. </dependency>

2 基础

命令的前期学习
https://blog.csdn.net/qq_41520636/article/details/116081185
下面代码完全对照该博客例子,编写的java 例子。

2.1 fastjson

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.4</version>
  5. </dependency>
  1. package com.hikktn.pojo;
  2. import com.alibaba.fastjson.annotation.JSONField;
  3. /**
  4. * @ClassName Person
  5. * @Description TODO
  6. * @Author lisonglin
  7. * @Date 2021/4/23 14:32
  8. * @Version 1.0
  9. */
  10. public class Person {
  11. @JSONField(name = "id")
  12. private int id;
  13. @JSONField(name = "name")
  14. private String name;
  15. @JSONField(name = "age")
  16. private int age;
  17. @JSONField(name = "address")
  18. private String address;
  19. public int getId() {
  20. return id;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. public String getAddress() {
  38. return address;
  39. }
  40. public void setAddress(String address) {
  41. this.address = address;
  42. }
  43. public Person(int id, String name, int age, String address) {
  44. this.id = id;
  45. this.name = name;
  46. this.age = age;
  47. this.address = address;
  48. }
  49. public Person() {
  50. }
  51. @Override
  52. public String toString() {
  53. return "Person{" + ", name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}';
  54. }
  55. }
  1. /**
  2. * 对象转换JSON
  3. */
  4. @Test
  5. public void whenJavaList_thanConvertToJsonCorrect() {
  6. List<Person> listOfPersons = new ArrayList<Person>();
  7. listOfPersons.add(new Person(1, "张三", 20, "重庆"));
  8. String jsonOutput = JSON.toJSONString(listOfPersons);
  9. System.out.println(jsonOutput);
  10. }

结果

  1. [{"address":"重庆","age":20,"id":1,"name":"张三"}]

3 索引是否存在 [exists]

  1. /**
  2. * 索引是否存在
  3. */
  4. @Test
  5. public void existIndex() throws IOException {
  6. IndicesClient indices = client.indices();
  7. GetIndexRequest getIndexRequest = new GetIndexRequest("person2");
  8. boolean exists = indices.exists(getIndexRequest, RequestOptions.DEFAULT);
  9. System.out.println(exists);
  10. }

4 关闭索引 [close]

  1. /**
  2. * 关闭索引
  3. * POST /person2/_close
  4. *
  5. * @throws IOException
  6. */
  7. @Test
  8. public void closeIndex() throws IOException {
  9. CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");
  10. CloseIndexResponse close = client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);
  11. System.out.println(close.isAcknowledged());
  12. }

5 打开索引 [open]

  1. /**
  2. * 打开索引
  3. * POST /person2/_open
  4. *
  5. * @return
  6. * @throws IOException
  7. */
  8. @Test
  9. public void openIndex() throws IOException {
  10. OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");
  11. boolean acknowledged = client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();
  12. System.out.println(acknowledged);
  13. }

6 创建索引 [create]

  1. /**
  2. * 创建索引
  3. * PUT /person2
  4. *
  5. * @throws IOException
  6. */
  7. @Test
  8. public void createIndex() throws IOException {
  9. //1.使用client获取操作索引对象
  10. IndicesClient indices = client.indices();
  11. //2.1 设置索引名称
  12. CreateIndexRequest request = new CreateIndexRequest("person2");
  13. // 2.索引setting配置
  14. request.settings(Settings.builder().put("index.number_of_shards",5)
  15. .put("index.number_of_replicas", 2) // 副本数
  16. .put("analysis.analyzer.default.tokenizer","standard")
  17. );
  18. // 别名
  19. // request.alias(new Alias("person"));
  20. // 发送请求
  21. // 同步方式
  22. CreateIndexResponse createIndexResponse = indices.create(request, RequestOptions.DEFAULT);
  23. //3.根据返回值判断结果
  24. System.out.println(createIndexResponse.isAcknowledged());
  25. System.out.println(createIndexResponse.isShardsAcknowledged());
  26. // 异步方式发送请求
  27. /*ActionListener<CreateIndexResponse> listener = new ActionListener<CreateIndexResponse>() {
  28. @Override
  29. public void onResponse(
  30. CreateIndexResponse createIndexResponse) {
  31. // 6、处理响应
  32. boolean acknowledged = createIndexResponse.isAcknowledged();
  33. boolean shardsAcknowledged = createIndexResponse
  34. .isShardsAcknowledged();
  35. System.out.println("acknowledged = " + acknowledged);
  36. System.out.println(
  37. "shardsAcknowledged = " + shardsAcknowledged);
  38. }
  39. @Override
  40. public void onFailure(Exception e) {
  41. System.out.println("创建索引异常:" + e.getMessage());
  42. }
  43. };
  44. client.indices().createAsync(request, RequestOptions.DEFAULT, listener);*/
  45. }

7 添加索引,并添加映射

  1. /**
  2. * 添加索引,并添加映射
  3. * PUT person2
  4. * {
  5. * "mappings": {
  6. * "properties": {
  7. * "name": {
  8. * "type": "keyword"
  9. * },
  10. * "age" : {
  11. * "type" : "long"
  12. * }
  13. * "address": {
  14. * "type": "text",
  15. * "analyzer": "ik_max_word"
  16. * }
  17. * }
  18. * }
  19. * }
  20. */
  21. @Test
  22. public void addIndexAndMapping() throws IOException {
  23. //1.使用client获取操作索引对象
  24. IndicesClient indices = client.indices();
  25. //2.具体操作获取返回值
  26. //2.具体操作,获取返回值
  27. CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");
  28. //2.1 设置mappings
  29. String mapping = "{\n" +
  30. " \"properties\": {\n" +
  31. " \"name\": {\n" + " " +
  32. " \"type\": \"keyword\"\n" + "" +
  33. " },\n" +
  34. " \"age\" : {\n" +
  35. " \"type\" : \"long\"\n" +
  36. " },\n" +
  37. " \"address\": {\n" +
  38. " \"type\": \"text\",\n" +
  39. " \"analyzer\": \"ik_max_word\"\n" +
  40. " }\n" +
  41. " }\n" +
  42. " }";
  43. createIndexRequest.mapping(mapping, XContentType.JSON);
  44. CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
  45. //3.根据返回值判断结果
  46. System.out.println(createIndexResponse.isAcknowledged());
  47. }
  48. @Test
  49. public void addIndexAndMapping2() throws IOException {
  50. //1.使用client获取操作索引对象
  51. IndicesClient indices = client.indices();
  52. //2.具体操作获取返回值
  53. //2.具体操作,获取返回值
  54. CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");
  55. //2.1 设置mappings
  56. IndexRequest indexRequest = new IndexRequest();
  57. // 拼接字符串
  58. XContentBuilder builder = JsonXContent.contentBuilder().startObject().startObject("mappings").startObject("properties").startObject("name").field("type", "keyword").endObject().startObject("age").field("type", "long").endObject().startObject("address").field("type", "text").field("analyzer", "ik_max_word").endObject().endObject().endObject();
  59. indexRequest.source(builder);
  60. // 生成JSON字符串
  61. String source = indexRequest.source().utf8ToString();
  62. createIndexRequest.mapping(source, XContentType.JSON);
  63. CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
  64. //3.根据返回值判断结果
  65. System.out.println(createIndexResponse.isAcknowledged());
  66. }

8 查询索引 [get]

  1. /**
  2. * 查询索引
  3. * GET /person2
  4. */
  5. @Test
  6. public void queryIndex() throws IOException {
  7. IndicesClient indices = client.indices();
  8. GetIndexRequest request = new GetIndexRequest("person2");
  9. GetIndexResponse response = indices.get(request, RequestOptions.DEFAULT);
  10. Map<String, MappingMetaData> mappings = response.getMappings();
  11. for (String key : mappings.keySet()) {
  12. System.out.println(key + "===" + mappings.get(key).getSourceAsMap());
  13. }
  14. }

9 删除索引 [delete]

  1. /**
  2. * 删除索引
  3. * DELETE /person2
  4. */
  5. @Test
  6. public void deleteIndex() throws IOException {
  7. IndicesClient indices = client.indices();
  8. DeleteIndexRequest deleteRequest = new DeleteIndexRequest("person2");
  9. AcknowledgedResponse delete = indices.delete(deleteRequest, RequestOptions.DEFAULT);
  10. System.out.println(delete.isAcknowledged());
  11. }

10 修改配置 [update]

  1. /**
  2. * 修改配置
  3. * POST /person2/_close
  4. * PUT /person2/_settings
  5. * {
  6. * "index":{
  7. * "number_of_replicas":2
  8. * }
  9. * }
  10. * POST /person2/_open
  11. *
  12. * @throws IOException
  13. */
  14. @Test
  15. public void updateSettingsIndex() throws IOException {
  16. // 关闭索引
  17. CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");
  18. client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);
  19. // 修改索引
  20. UpdateRequest updateRequest = new UpdateRequest();
  21. // 修改分片数
  22. Settings settings = Settings.builder().put("number_of_replicas", "2").build();
  23. updateRequest.script(Script.parse(settings));
  24. UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
  25. // 修改成功后的结果
  26. System.out.println(update.getGetResult());
  27. // 打开索引
  28. OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");
  29. client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();
  30. }

11 修改文档 [update]

  1. /**
  2. * 修改文档
  3. *
  4. * @throws IOException
  5. */
  6. @Test
  7. public void updateDocIndex() throws IOException {
  8. // 关闭索引
  9. CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");
  10. client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);
  11. // 修改的文档
  12. List<Person> listOfPersons = new ArrayList<Person>();
  13. listOfPersons.add(new Person(1, "张三", 20, "重庆"));
  14. String personJson = JSON.toJSONString(listOfPersons);
  15. // 修改索引
  16. UpdateRequest updateRequest = new UpdateRequest();
  17. updateRequest.id(String.valueOf(listOfPersons.get(0).getId())).doc(personJson);
  18. UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
  19. // 修改成功后的结果
  20. System.out.println(update.getGetResult());
  21. // 打开索引
  22. OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");
  23. client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();
  24. }

12 添加文档 [add]

  1. /**
  2. * 添加文档
  3. * POST /person2/_doc/1
  4. * {
  5. * "name":"张三",
  6. * "age":18,
  7. * "address":"重庆市江北区"
  8. * }
  9. *
  10. */
  11. @Test
  12. public void addDoc1() {
  13. Map<String, Object> map = new HashMap<>();
  14. map.put("name", "张三");
  15. map.put("age", "18");
  16. map.put("address", "重庆市江北区");
  17. IndexRequest request = new IndexRequest("person2").id("1").source(map);
  18. // 其他的一些可选设置
  19. /*//设置routing值
  20. request.routing("routing");
  21. //设置主分片等待时长
  22. request.timeout(TimeValue.timeValueSeconds(1));
  23. //设置重刷新策略
  24. request.setRefreshPolicy("wait_for");
  25. //设置版本号
  26. request.version(2);
  27. //操作类别
  28. request.opType(DocWriteRequest.OpType.CREATE); */
  29. IndexResponse response = null;
  30. try {
  31. response = client.index(request, RequestOptions.DEFAULT);
  32. } catch (ElasticsearchException e) {
  33. // 捕获,并处理异常
  34. //判断是否版本冲突、create但文档已存在冲突
  35. if (e.status() == RestStatus.CONFLICT) {
  36. logger.error("冲突了,请在此写冲突处理逻辑!\n" + e.getDetailedMessage());
  37. }
  38. logger.error("索引异常", e);
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. // 处理响应
  43. if(response != null) {
  44. String index = response.getIndex();
  45. String type = response.getType();
  46. String id = response.getId();
  47. long version = response.getVersion();
  48. if (response.getResult() == DocWriteResponse.Result.CREATED) {
  49. System.out.println("新增文档成功,处理逻辑代码写到这里。");
  50. } else if (response.getResult() == DocWriteResponse.Result.UPDATED) {
  51. System.out.println("修改文档成功,处理逻辑代码写到这里。");
  52. }
  53. // 分片处理信息
  54. ReplicationResponse.ShardInfo shardInfo = response.getShardInfo();
  55. if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
  56. }
  57. // 如果有分片副本失败,可以获得失败原因信息
  58. if (shardInfo.getFailed() > 0) {
  59. for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) {
  60. String reason = failure.reason();
  61. System.out.println("副本失败原因:" + reason);
  62. }
  63. }
  64. }
  65. //异步方式发送索引请求
  66. /* ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {
  67. @Override
  68. public void onResponse(IndexResponse indexResponse) {
  69. }
  70. @Override
  71. public void onFailure(Exception e) {
  72. }
  73. };
  74. client.indexAsync(request, RequestOptions.DEFAULT, listener);*/
  75. }

13 批量导入文档 [bulk]

  1. /**
  2. * 批量导入文档
  3. * POST _bulk
  4. * {"create":{"_index":"person1","_id":"2"}}
  5. * {"name":"李四","age":19,"address":"重庆市渝中区"}
  6. * {"create":{"_index":"person1","_id":"3"}}
  7. * {"name":"王五","age":20,"address":"重庆市南岸区"}
  8. * {"create":{"_index":"person1","_id":"4"}}
  9. * {"name":"何六","age":21,"address":"四川省高新区"}
  10. * {"create":{"_index":"person1","_id":"5"}}
  11. * {"name":"田七","age":22,"address":"四川省双流区"}
  12. * {"create":{"_index":"person1","_id":"6"}}
  13. * {"name":"黄黄","age":25,"address":"上海市长宁区"}
  14. *
  15. * @throws IOException
  16. */
  17. @Test
  18. public void addDoc2() throws IOException {
  19. List<Person> personList = new ArrayList<>();
  20. // 模拟从数据库中查询出数据
  21. Person person0 = new Person(2, "李四", 19, "重庆市渝中区");
  22. Person person1 = new Person(3, "王五", 20, "重庆市南岸区");
  23. Person person2 = new Person(4, "何六", 21, "四川省高新区");
  24. Person person3 = new Person(5, "田七", 22, "四川省双流区");
  25. Person person4 = new Person(6, "黄黄", 25, "上海市长宁区");
  26. personList.add(person0);
  27. personList.add(person1);
  28. personList.add(person2);
  29. personList.add(person3);
  30. personList.add(person4);
  31. BulkRequest bulkRequest = new BulkRequest();
  32. // 添加索引文档的请求参数
  33. for (Person person : personList) {
  34. String data = JSON.toJSONString(person);
  35. IndexRequest request = new IndexRequest("person2").id(String.valueOf(person.getId())).source(data, XContentType.JSON);
  36. bulkRequest.add(request);
  37. }
  38. // 批量执行
  39. BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
  40. System.out.println(bulkResponse.status());
  41. //4、处理响应
  42. if(bulkResponse != null) {
  43. for (BulkItemResponse bulkItemResponse : bulkResponse) {
  44. DocWriteResponse itemResponse = bulkItemResponse.getResponse();
  45. if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.INDEX
  46. || bulkItemResponse.getOpType() == DocWriteRequest.OpType.CREATE) {
  47. IndexResponse indexResponse = (IndexResponse) itemResponse;
  48. //TODO 新增成功的处理
  49. } else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.UPDATE) {
  50. UpdateResponse updateResponse = (UpdateResponse) itemResponse;
  51. //TODO 修改成功的处理
  52. } else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.DELETE) {
  53. DeleteResponse deleteResponse = (DeleteResponse) itemResponse;
  54. //TODO 删除成功的处理
  55. }
  56. }
  57. }
  58. //异步方式发送批量操作请求
  59. /*ActionListener<BulkResponse> listener = new ActionListener<BulkResponse>() {
  60. @Override
  61. public void onResponse(BulkResponse bulkResponse) {
  62. }
  63. @Override
  64. public void onFailure(Exception e) {
  65. }
  66. };
  67. client.bulkAsync(bulkRequest,RequestOptions.DEFAULT, listener);*/
  68. }

14 查询所有 [matchAll]

  1. /**
  2. * 查询所有
  3. * 1. matchAll
  4. * 2. 将查询结果封装为Goods对象,装载到List中
  5. * 3. 分页。默认显示10条
  6. * # 全文检索
  7. * GET /person2/_search
  8. * {
  9. * "query": { "match_all": {} }
  10. * }
  11. */
  12. @Test
  13. public void matchAllIndex() throws IOException {
  14. //2. 构建查询请求对象,指定查询的索引名称
  15. SearchRequest searchRequest = new SearchRequest("person2");
  16. //4. 创建查询条件构建器SearchSourceBuilder
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. //6. 查询条件
  19. QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
  20. //5. 指定查询条件
  21. sourceBuilder.query(queryBuilder);
  22. //3. 添加查询条件构建器 SearchSourceBuilder
  23. searchRequest.source(sourceBuilder);
  24. // 8 . 添加分页信息 不设置 默认10条
  25. // sourceBuilder.from(0);
  26. // sourceBuilder.size(100);
  27. //1. 查询,获取查询结果
  28. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  29. //7. 获取命中对象 SearchHits
  30. SearchHits hits = searchResponse.getHits();
  31. //7.1 获取总记录数
  32. Long total = hits.getTotalHits().value;
  33. System.out.println("总数:" + total);
  34. //7.2 获取Hits数据 数组
  35. SearchHit[] hits1 = hits.getHits();
  36. //获取json字符串格式的数据
  37. List<Person> personList = new ArrayList<>();
  38. for (SearchHit searchHit : hits1) {
  39. String sourceAsString = searchHit.getSourceAsString();
  40. //转为java对象
  41. Person person = JSON.parseObject(sourceAsString, Person.class);
  42. personList.add(person);
  43. }
  44. for (Person person : personList) {
  45. System.out.println(person);
  46. }
  47. }

15 单个词条检索 [term]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "term": {
  6. * "address": {
  7. * "value": "南岸"
  8. * }
  9. * }
  10. * }
  11. * }
  12. */
  13. @Test
  14. public void termIndex() throws IOException {
  15. SearchRequest searchRequest = new SearchRequest("person2");
  16. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  17. // 查询条件
  18. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("address", "南岸");
  19. sourceBuilder.query(termQueryBuilder);
  20. searchRequest.source(sourceBuilder);
  21. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  22. System.out.println(searchResponse.getHits());
  23. }

16 多词条检索 [ terms ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "terms": {
  6. * "address": ["重庆","区"]
  7. * }
  8. * }
  9. * }
  10. */
  11. @Test
  12. public void termsIndex() throws IOException {
  13. SearchRequest searchRequest = new SearchRequest("person2");
  14. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  15. // 查询条件
  16. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆", "区");
  17. sourceBuilder.query(termsQueryBuilder);
  18. searchRequest.source(sourceBuilder);
  19. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  20. System.out.println(searchResponse.getHits());
  21. }

17 模糊查询 [ fuzzy ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "fuzzy": {
  6. * "address": {
  7. * "value": "南岸12",
  8. * "fuzziness":"2"
  9. * }
  10. * }
  11. * }
  12. * }
  13. */
  14. @Test
  15. public void fuzzyIndex() throws IOException {
  16. SearchRequest searchRequest = new SearchRequest("person2");
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. // 查询条件
  19. FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("address", "南岸12").fuzziness(Fuzziness.TWO);
  20. sourceBuilder.query(fuzzyQueryBuilder);
  21. searchRequest.source(sourceBuilder);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

18 全文查询 [ match ] [or]

  1. /**
  2. * # 默认取并集(or)
  3. * GET /person2/_search
  4. * {
  5. * "query": {
  6. * "match": {
  7. * "address":"重庆南岸"
  8. * }
  9. * }
  10. * }
  11. *
  12. * @throws IOException
  13. */
  14. @Test
  15. public void matchOrIndex() throws IOException {
  16. SearchRequest searchRequest = new SearchRequest("person2");
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. // 查询条件
  19. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "重庆南岸");
  20. sourceBuilder.query(matchQueryBuilder);
  21. searchRequest.source(sourceBuilder);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

19 全文查询 [ match ] [and]

  1. /**
  2. * # 交集(and)
  3. * GET /person2/_search
  4. * {
  5. * "query": {
  6. * "match": {
  7. * "address": {
  8. * "query": "重庆南岸",
  9. * "operator": "and"
  10. * }
  11. * }
  12. * }
  13. * }
  14. *
  15. * @throws IOException
  16. */
  17. @Test
  18. public void matchAndIndex() throws IOException {
  19. SearchRequest searchRequest = new SearchRequest("person2");
  20. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  21. // 查询条件
  22. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "重庆南岸").operator(Operator.AND);
  23. sourceBuilder.query(matchQueryBuilder);
  24. searchRequest.source(sourceBuilder);
  25. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  26. System.out.println(searchResponse.getHits());
  27. }

20 多字段检索 [ multi_match ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "multi_match": {
  6. * "query": "重庆",
  7. * "fields": ["address","name"]
  8. * }
  9. * }
  10. * }
  11. *
  12. * @throws IOException
  13. */
  14. @Test
  15. public void multiMatchIndex() throws IOException {
  16. SearchRequest searchRequest = new SearchRequest("person2");
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. // 查询条件
  19. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("重庆", "address", "name");
  20. sourceBuilder.query(multiMatchQueryBuilder);
  21. searchRequest.source(sourceBuilder);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

21 通配符检索 [ wildcard ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "wildcard": {
  6. * "address":"重*"
  7. * }
  8. * }
  9. * }
  10. */
  11. @Test
  12. public void wildcardIndex() throws IOException {
  13. SearchRequest searchRequest = new SearchRequest("person2");
  14. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  15. // 查询条件
  16. WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("address", "重*");
  17. sourceBuilder.query(wildcardQuery);
  18. searchRequest.source(sourceBuilder);
  19. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  20. System.out.println(searchResponse.getHits());
  21. }

22 正则查询 [ regexp ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "regexp": {
  6. * "address":"(.)*"
  7. * }
  8. * }
  9. * }
  10. *
  11. * @throws IOException
  12. */
  13. @Test
  14. public void regexpIndex() throws IOException {
  15. SearchRequest searchRequest = new SearchRequest("person2");
  16. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  17. // 查询条件
  18. RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("address", "(.)*");
  19. sourceBuilder.query(regexpQueryBuilder);
  20. searchRequest.source(sourceBuilder);
  21. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  22. System.out.println(searchResponse.getHits());
  23. }

23 前缀查询 [ prefix ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "prefix": {
  6. * "address":"上"
  7. * }
  8. * }
  9. * }
  10. *
  11. * @throws IOException
  12. */
  13. @Test
  14. public void prefixIndex() throws IOException {
  15. SearchRequest searchRequest = new SearchRequest("person2");
  16. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  17. // 查询条件
  18. PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("address", "上");
  19. sourceBuilder.query(prefixQueryBuilder);
  20. searchRequest.source(sourceBuilder);
  21. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  22. System.out.println(searchResponse.getHits());
  23. }

24 范围查询 [ range ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "range": {
  6. * "age":{
  7. * "gte":18,
  8. * "lte":20
  9. * }
  10. * }
  11. * }
  12. * }
  13. *
  14. * @throws IOException
  15. */
  16. @Test
  17. public void rangeIndex() throws IOException {
  18. SearchRequest searchRequest = new SearchRequest("person2");
  19. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  20. // 查询条件
  21. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(18).lte(20);
  22. sourceBuilder.query(rangeQueryBuilder);
  23. searchRequest.source(sourceBuilder);
  24. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  25. System.out.println(searchResponse.getHits());
  26. }

25 多条件查询 [ query_string ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "query_string": {
  6. * "default_field": "address",
  7. * "query": "重庆 AND 市 OR 区"
  8. * }
  9. * }
  10. * }
  11. *
  12. * @throws IOException
  13. */
  14. @Test
  15. public void queryStringIndex() throws IOException {
  16. SearchRequest searchRequest = new SearchRequest("person2");
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. // 查询条件
  19. QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("重庆 AND 市 OR 区").defaultField("address");
  20. sourceBuilder.query(queryStringQueryBuilder);
  21. searchRequest.source(sourceBuilder);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

26 自动分词的连接符 [ default_operator ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "query_string": {
  6. * "default_field": "address",
  7. * "default_operator": "AND",
  8. * "query": "上海市"
  9. * }
  10. * }
  11. * }
  12. */
  13. @Test
  14. public void queryStringAndIndex() throws IOException {
  15. SearchRequest searchRequest = new SearchRequest("person2");
  16. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  17. // 查询条件
  18. QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("上海市").defaultField("address").defaultOperator(Operator.AND);
  19. sourceBuilder.query(queryStringQueryBuilder);
  20. searchRequest.source(sourceBuilder);
  21. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  22. System.out.println(searchResponse.getHits());
  23. }

27 单例多条件查询 [ simple_query_string ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "simple_query_string": {
  6. * "query": "重庆 AND 市 OR 区",
  7. * "fields": ["address"]
  8. * }
  9. * }
  10. * }
  11. *
  12. * @throws IOException
  13. */
  14. @Test
  15. public void simpleQueryStringAndIndex() throws IOException {
  16. SearchRequest searchRequest = new SearchRequest("person2");
  17. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  18. // 查询条件
  19. SimpleQueryStringBuilder simpleQueryStringBuilder = QueryBuilders.simpleQueryStringQuery("重庆 AND 市 OR 区").field("address");
  20. sourceBuilder.query(simpleQueryStringBuilder);
  21. searchRequest.source(sourceBuilder);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

28 布尔查询 [ bool ] [must]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "bool": {
  6. * "must": [
  7. * {
  8. * "term": {
  9. * "address": {
  10. * "value": "重庆"
  11. * }
  12. * }
  13. * }
  14. * ]
  15. * }
  16. * }
  17. * }
  18. *
  19. */
  20. @Test
  21. public void boolQueryMustTermIndex() throws IOException {
  22. SearchRequest searchRequest = new SearchRequest("person2");
  23. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  24. //1.构建boolQuery
  25. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  26. // 查询条件
  27. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");
  28. // 判断 must
  29. boolQuery.must(termsQueryBuilder);
  30. sourceBuilder.query(boolQuery);
  31. searchRequest.source(sourceBuilder);
  32. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  33. System.out.println(searchResponse.getHits());
  34. }

29 布尔查询 [ bool ] [filter]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "bool": {
  6. * "filter": [
  7. * {
  8. * "term": {
  9. * "address": {
  10. * "value": "重庆"
  11. * }
  12. * }
  13. * }
  14. * ]
  15. * }
  16. * }
  17. * }
  18. */
  19. @Test
  20. public void boolQueryFilterTermIndex() throws IOException {
  21. SearchRequest searchRequest = new SearchRequest("person2");
  22. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  23. //1.构建boolQuery
  24. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  25. // 查询条件
  26. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");
  27. // 判断 filter
  28. boolQuery.filter(termsQueryBuilder);
  29. sourceBuilder.query(boolQuery);
  30. searchRequest.source(sourceBuilder);
  31. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  32. System.out.println(searchResponse.getHits());
  33. }

30 布尔查询 [ bool ] [should]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": {
  5. * "bool": {
  6. * "should": [
  7. * {
  8. * "terms": {
  9. * "address": [
  10. * "河南",
  11. * "河北",
  12. * "重庆"
  13. * ]
  14. * }
  15. * }
  16. * ]
  17. * }
  18. * }
  19. * }
  20. *
  21. */
  22. @Test
  23. public void boolQueryShouldTermIndex() throws IOException {
  24. SearchRequest searchRequest = new SearchRequest("person2");
  25. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  26. //1.构建boolQuery
  27. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  28. // 查询条件
  29. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆","河南","河北");
  30. // 判断
  31. boolQuery.should(termsQueryBuilder);
  32. sourceBuilder.query(boolQuery);
  33. searchRequest.source(sourceBuilder);
  34. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  35. System.out.println(searchResponse.getHits());
  36. }

31 布尔查询 [ bool ] 组合

  1. /**
  2. * # 组合
  3. * GET /person2/_search
  4. * {
  5. * "query": {
  6. * "bool": {
  7. * "must": [
  8. * {
  9. * "term": {
  10. * "address": {
  11. * "value": "重庆"
  12. * }
  13. * }
  14. * }
  15. * ],
  16. * "filter": [
  17. * {
  18. * "match": {
  19. * "address": {
  20. * "value": "南岸"
  21. * }
  22. * }
  23. * }
  24. * ]
  25. * }
  26. * }
  27. * }
  28. */
  29. @Test
  30. public void boolQueryMustAndFilterTermIndex() throws IOException {
  31. SearchRequest searchRequest = new SearchRequest("person2");
  32. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  33. //1.构建boolQuery
  34. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  35. // 查询条件
  36. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");
  37. // 判断
  38. boolQuery.must(termsQueryBuilder);
  39. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "南岸");
  40. boolQuery.filter(matchQueryBuilder);
  41. sourceBuilder.query(boolQuery);
  42. searchRequest.source(sourceBuilder);
  43. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  44. System.out.println(searchResponse.getHits());
  45. }

32 倒序 [ sort ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": { "match_all": {} },
  5. * "sort": [
  6. * { "_id": "desc" }
  7. * ]
  8. * }
  9. */
  10. @Test
  11. public void querySortIndex() throws IOException {
  12. SearchRequest searchRequest = new SearchRequest("person2");
  13. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  14. // 查询条件
  15. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
  16. sourceBuilder.query(matchAllQueryBuilder);
  17. // 降序
  18. sourceBuilder.sort("_id", SortOrder.DESC);
  19. searchRequest.source(sourceBuilder);
  20. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  21. System.out.println(searchResponse.getHits());
  22. }

33 关键字查询 [ includes ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": { "match_all": {} },
  5. * "_source": ["name","张三"]
  6. * }
  7. */
  8. @Test
  9. public void querySourceIndex() throws IOException {
  10. SearchRequest searchRequest = new SearchRequest("person2");
  11. //选择返回的字段
  12. String[] includes = new String[]{"name", "张三"};
  13. String[] excludes = Strings.EMPTY_ARRAY;
  14. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  15. sourceBuilder.fetchSource(includes, excludes);
  16. // 查询条件
  17. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
  18. sourceBuilder.query(matchAllQueryBuilder);
  19. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  20. System.out.println(searchResponse.getHits());
  21. }

34 排除关键字查询 [ excludes ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "_source": {
  5. * "excludes":"age"
  6. * },
  7. * "query": { "match_all": {} }
  8. * }
  9. */
  10. @Test
  11. public void queryExcludesSourceIndex() throws IOException {
  12. SearchRequest searchRequest = new SearchRequest("person2");
  13. //选择返回的字段
  14. String[] includes = Strings.EMPTY_ARRAY;
  15. String[] excludes = new String[]{"age"};
  16. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  17. sourceBuilder.fetchSource(includes, excludes);
  18. // 查询条件
  19. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
  20. sourceBuilder.query(matchAllQueryBuilder);
  21. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  22. System.out.println(searchResponse.getHits());
  23. }

35 分页查询

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "query": { "match_all": {} },
  5. * "from": 3,
  6. * "size": 3,
  7. * "sort": { "age": "asc" }
  8. * }
  9. */
  10. @Test
  11. public void queryFromSizeIndex() throws IOException {
  12. SearchRequest searchRequest = new SearchRequest("person2");
  13. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  14. // 查询条件
  15. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
  16. sourceBuilder.query(matchAllQueryBuilder);
  17. // 分页
  18. sourceBuilder.from(3);
  19. sourceBuilder.size(3);
  20. // 正序
  21. sourceBuilder.sort("age",SortOrder.ASC);
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. System.out.println(searchResponse.getHits());
  24. }

36 桶聚合 [ aggs ]

  1. /**
  2. * GET person2/_search
  3. * {
  4. * "size": 0,
  5. * "query": {
  6. * "match": {
  7. * "address": "重庆"
  8. * }
  9. * },
  10. * "aggs": {
  11. * "address_name": {
  12. * "terms": {
  13. * "field": "name",
  14. * "size": 10
  15. * }
  16. * }
  17. * }
  18. * }
  19. */
  20. @Test
  21. public void AggQuery() throws IOException {
  22. SearchRequest searchRequest = new SearchRequest("person2");
  23. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  24. MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "重庆");
  25. sourceBuilder.query(queryBuilder);
  26. // 查询前10个城市
  27. AggregationBuilder aggregation= AggregationBuilders.terms("address_name").field("name").size(10);
  28. sourceBuilder.aggregation(aggregation);
  29. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  30. //7. 获取命中对象 SearchHits
  31. SearchHits hits = searchResponse.getHits();
  32. //7.1 获取总记录数
  33. Long total= hits.getTotalHits().value;
  34. System.out.println("总数:"+total);
  35. // aggregations 对象
  36. Aggregations aggregations = searchResponse.getAggregations();
  37. //将aggregations 转化为map
  38. Map<String, Aggregation> aggregationMap = aggregations.asMap();
  39. //通过key获取address_name对象 使用Aggregation的子类接收 buckets属性在Terms接口中体现
  40. // Aggregation address_name = aggregationMap.get("address_name");
  41. Terms address_name =(Terms) aggregationMap.get("address_name");
  42. //获取buckets 数组集合
  43. List<? extends Terms.Bucket> buckets = address_name.getBuckets();
  44. Map<String,Object>map=new HashMap<>();
  45. //遍历buckets key 属性名,doc_count 统计聚合数
  46. for (Terms.Bucket bucket : buckets) {
  47. System.out.println(bucket.getKey());
  48. map.put(bucket.getKeyAsString(),bucket.getDocCount());
  49. }
  50. System.out.println(map);
  51. }

37 指标聚合 [ aggs ]

  1. /**
  2. * GET person2/_search
  3. * {
  4. * "query": {
  5. * "match": {
  6. * "address": "四川"
  7. * }
  8. * },
  9. * "aggs": {
  10. * "max_age": {
  11. * "max": {
  12. * "field": "age"
  13. * }
  14. * }
  15. * }
  16. * }
  17. */
  18. @Test
  19. public void AggMaxQuery() throws IOException {
  20. SearchRequest searchRequest = new SearchRequest("person2");
  21. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  22. MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "重庆");
  23. sourceBuilder.query(queryBuilder);
  24. // 查询前10个城市
  25. AggregationBuilder aggregation = AggregationBuilders.max("max_age").field("age");
  26. sourceBuilder.aggregation(aggregation);
  27. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  28. System.out.println(searchResponse.getAggregations());
  29. }

38 嵌套查询

  1. /**
  2. * GET person2/_search
  3. * {
  4. * "size": 0,
  5. * "aggs": {
  6. * "my_name": {
  7. * "terms": {
  8. * "field": "name"
  9. * },
  10. * "aggs": {
  11. * "age_max":{
  12. * "max": {
  13. * "field": "age"
  14. * }
  15. * }
  16. * }
  17. * }
  18. * }
  19. * }
  20. */
  21. @Test
  22. public void AggMaxAggQuery() throws IOException {
  23. SearchRequest searchRequest = new SearchRequest("person2");
  24. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  25. sourceBuilder.size(0);
  26. // 查询前10个城市
  27. TermsAggregationBuilder terms = AggregationBuilders.terms("my_name").field("name");
  28. AggregationBuilder aggregation = AggregationBuilders.max("max_age").field("age");
  29. sourceBuilder.aggregation(terms);
  30. sourceBuilder.aggregation(aggregation);
  31. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  32. System.out.println(searchResponse.getAggregations());
  33. }

39 阶梯分桶 [ histogram ]

  1. /**
  2. * GET /person2/_search
  3. * {
  4. * "size": 0,
  5. * "aggs": {
  6. * "age": {
  7. * "histogram": {
  8. * "field": "age",
  9. * "interval": 2,
  10. * "min_doc_count":1
  11. * }
  12. * }
  13. * }
  14. * }
  15. */
  16. @Test
  17. public void AggHistogramQuery() throws IOException {
  18. SearchRequest searchRequest = new SearchRequest("person2");
  19. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  20. sourceBuilder.size(0);
  21. HistogramAggregationBuilder aggregationBuilder = AggregationBuilders.histogram("age").field("age").interval(2).minDocCount(1);
  22. sourceBuilder.aggregation(aggregationBuilder);
  23. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  24. System.out.println(searchResponse.getAggregations());
  25. }

40 高亮查询 [ highlight ]

  1. /**
  2. * GET person2/_search
  3. * {
  4. * "query": {
  5. * "match": {
  6. * "address": "四川"
  7. * }
  8. * },
  9. * "highlight": {
  10. * "fields": {
  11. * "address": {
  12. * "pre_tags": "<font color='red'>",
  13. * "post_tags": "</font>"
  14. * }
  15. * }
  16. * }
  17. * }
  18. * @throws IOException
  19. */
  20. @Test
  21. public void testHighLightQuery() throws IOException {
  22. SearchRequest searchRequest = new SearchRequest("person2");
  23. SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
  24. // 1. 查询title包含手机的数据
  25. MatchQueryBuilder query = QueryBuilders.matchQuery("address", "四川");
  26. sourceBulider.query(query);
  27. // 设置高亮
  28. HighlightBuilder highlighter = new HighlightBuilder();
  29. // 设置三要素
  30. highlighter.field("address");
  31. // 设置前后缀标签
  32. highlighter.preTags("<font color='red'>");
  33. highlighter.postTags("</font>");
  34. //加载已经设置好的高亮配置
  35. sourceBulider.highlighter(highlighter);
  36. searchRequest.source(sourceBulider);
  37. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  38. SearchHits searchHits = searchResponse.getHits();
  39. // 获取记录数
  40. long value = searchHits.getTotalHits().value;
  41. System.out.println("总记录数:"+value);
  42. List<Person> personList = new ArrayList<>();
  43. SearchHit[] hits = searchHits.getHits();
  44. for (SearchHit hit : hits) {
  45. String sourceAsString = hit.getSourceAsString();
  46. //转为java
  47. Person person = JSON.parseObject(sourceAsString, Person.class);
  48. // 获取高亮结果,替换person中的address
  49. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  50. HighlightField HighlightField = highlightFields.get("address");
  51. Text[] fragments = HighlightField.fragments();
  52. //highlight address替换 替换person中的address
  53. person.setAddress(fragments[0].toString());
  54. personList.add(person);
  55. }
  56. for (Person person : personList) {
  57. System.out.println(person);
  58. }
  59. }

image.png41 复制索引 [ _reindex ]

  1. /**
  2. * POST _reindex
  3. * {
  4. * "source": {"index": "person1"},
  5. * "dest": {"index": "person2"}
  6. * }
  7. */
  8. @Test
  9. public void reindex() throws IOException {
  10. ReindexRequest request = new ReindexRequest(); //创建ReindexRequest
  11. request.setSourceIndices("person1"); //添加要从源中复制的列表
  12. request.setDestIndex("person2"); //添加目标索引
  13. request.setDestVersionType(VersionType.EXTERNAL); //设置versionType为EXTERNAL
  14. request.setDestOpType("create"); //设置versionType为create
  15. request.setConflicts("proceed"); //设置版本冲突时继续
  16. request.setSourceQuery(new TermQueryBuilder("user", "kimchy")); //仅复制字段用户设置为kimchy的文档
  17. request.setSize(10); //只拷贝10个文档
  18. request.setSourceBatchSize(100); //单次处理100个文档
  19. request.setDestPipeline("my_pipeline"); //设置管线为my_pipeline
  20. // 同步执行
  21. BulkByScrollResponse bulkResponse =
  22. client.reindex(request, RequestOptions.DEFAULT);
  23. System.out.println(bulkResponse);
  24. }