当前位置:   article > 正文

ElasticSearch-学习笔记04【Java客户端操作索引库】_java 创建elasticsearch索引

java 创建elasticsearch索引
  1. ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】
  2. ElasticSearch-学习笔记02【ElasticSearch索引库维护】
  3. ElasticSearch-学习笔记03【ElasticSearch集群】
  4. ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】
  5. ElasticSearch-学习笔记05【SpringDataElasticSearch】

目录

01-ES课程介绍

02-使用Java客户端创建索引库

03-使用Java客户端设置mapping步骤

04-使用java客户端设置mapping映射

05-向索引库中添加文档

06-添加文档的第二种方式

07-索引库查询_根据id查询

 08-索引库查询_根据term查询

09-索引库查询_queryString查询

10-查询分页设置

01、插入数据

02、设置分页

11-查询结果高亮显示

01、查看高亮结果

02、高亮显示代码实现


01-ES课程介绍

学习目标:

  1. 能够使用java客户端完成创建、删除索引的操作

  2. 能够使用java客户端完成文档的增删改的操作

  3. 能够使用java客户端完成文档的查询操作

  4. 能够完成文档的分页操作

  5. 能够完成文档的高亮查询操作

  6. 能够搭建Spring Data ElasticSearch的环境

  7. 能够完成Spring Data ElasticSearch的基本增删改查操作

  8. 能够掌握基本条件查询的方法命名规则

管理ES的客户端工具:postman、head插件。

02-使用Java客户端创建索引库

一、使用Java客户端管理ES
1、创建索引库
    步骤:
    1)创建一个Java工程
    2)添加jar包,添加maven的坐标
    3)编写测试方法实现创建索引库
        1、创建一个Settings对象,相当于是一个配置信息,主要用于配置集群的名称。
        2、创建一个客户端Client对象
        3、使用client对象创建一个索引库
        4、关闭client对象

9201、9202、9203:对外提供http服务的端口号;

9301、9302、9303:tcp形式连接ES服务器(InetSocketTransportAddress方法)。

  1. package com.itheima.es;
  2. import org.elasticsearch.client.transport.TransportClient;
  3. import org.elasticsearch.common.settings.Settings;
  4. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  5. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  6. import org.junit.Test;
  7. import java.net.InetAddress;
  8. public class ElasticSearchClientTest {
  9. @Test
  10. public void createIndex() throws Exception {
  11. //1、创建一个Settings对象,相当于是一个配置信息,主要配置集群的名称。
  12. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  13. //2、创建一个客户端Client对象
  14. TransportClient client = new PreBuiltTransportClient(settings);
  15. //向client中添加三个ip地址的端口号,防止一个服务器不好使然后出现bug
  16. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
  17. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  19. //3、使用client对象创建一个索引库
  20. client.admin().indices().prepareCreate("index_hello").get();//.get()执行操作//index_hello索引名称
  21. //4、关闭client对象
  22. client.close();
  23. }
  24. }

ElasticSearch搭建集群时的闪退问题

03-使用Java客户端设置mapping步骤

 

一、使用Java客户端管理ES
1、创建索引库
    步骤:
    1)创建一个Java工程
    2)添加jar包,添加maven的坐标
    3)编写测试方法实现创建索引库
        1、创建一个Settings对象,相当于是一个配置信息,主要配置集群的名称。
        2、创建一个客户端Client对象
        3、使用client对象创建一个索引库
        4、关闭client对象
2、使用Java客户端设置Mappings
    步骤:
    1)创建一个Settings对象
    2)创建一个Client对象
    3)创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对象
    4)使用client向es服务器发送mapping信息
    5)关闭client对象

04-使用java客户端设置mapping映射

  1. package com.itheima.es;
  2. import org.elasticsearch.client.transport.TransportClient;
  3. import org.elasticsearch.common.settings.Settings;
  4. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  5. import org.elasticsearch.common.xcontent.XContentBuilder;
  6. import org.elasticsearch.common.xcontent.XContentFactory;
  7. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  8. import org.junit.Test;
  9. import java.net.InetAddress;
  10. public class ElasticSearchClientTest {
  11. @Test
  12. public void createIndex() throws Exception {
  13. //1、创建一个Settings对象,相当于是一个配置信息,主要配置集群的名称。
  14. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  15. //2、创建一个客户端Client对象
  16. TransportClient client = new PreBuiltTransportClient(settings);
  17. //向client中添加三个ip地址的端口号,防止一个服务器不好使然后出现bug
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
  19. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
  20. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  21. //3、使用client对象创建一个索引库
  22. client.admin().indices().prepareCreate("index_hello").get();//index_hello索引名称、get()执行操作
  23. //4、关闭client对象
  24. client.close();
  25. }
  26. @Test
  27. public void setMappings() throws Exception {
  28. //1、创建一个Settings对象
  29. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  30. //2、创建一个Client对象,创建一个TransportClient对象
  31. TransportClient client = new PreBuiltTransportClient(settings)
  32. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301))
  33. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
  34. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  35. //3、创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对象
  36. /*
  37. {
  38. "article": {type名称,表名:文章
  39. "properties": {
  40. "id": {//字段
  41. "type": "long",
  42. "store": true
  43. // "index": "not_analyzed"
  44. },
  45. "title": {
  46. "type": "text",
  47. "store": true,
  48. "index": true,
  49. "analyzer": "ik_smart"//ik_max_word、standard
  50. },
  51. "content": {
  52. "type": "text",
  53. "store": true,
  54. "index": true,//analyzed
  55. "analyzer": "ik_smart"//ik_max_word、standard
  56. }
  57. }
  58. }
  59. }
  60. */
  61. XContentBuilder builder = XContentFactory.jsonBuilder()
  62. .startObject()
  63. .startObject("article")//type名称
  64. .startObject("properties")
  65. .startObject("id")
  66. .field("type", "long")
  67. .field("store", true)
  68. .endObject()
  69. .startObject("title")
  70. .field("type", "text")
  71. .field("store", true)
  72. .field("analyzer", "ik_smart")
  73. .endObject()
  74. .startObject("content")
  75. .field("type", "text")
  76. .field("store", true)
  77. .field("analyzer", "ik_smart")
  78. .endObject()
  79. .endObject()
  80. .endObject()
  81. .endObject();
  82. //4、使用client向es服务器发送mapping信息,使用client把mapping信息设置到索引库中
  83. client.admin().indices()
  84. .preparePutMapping("index_hello")//设置要做映射的索引,设置索引库名称
  85. .setType("article")//设置要做映射的type,设置type名称
  86. .setSource(builder)//mapping信息,可以是XContentBuilder对象也可以是json格式的字符串
  87. .get();
  88. //5、关闭client对象,关闭链接
  89. client.close();
  90. }
  91. }

05-向索引库中添加文档

es集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档(数据)包含多个字段(Fields)(列)

一、使用Java客户端管理ES
1、创建索引库
    步骤:
    1)创建一个Java工程
    2)添加jar包,添加maven的坐标
    3)编写测试方法实现创建索引库
        1、创建一个Settings对象,相当于是一个配置信息,主要用于配置集群的名称。
        2、创建一个客户端Client对象
        3、使用client对象创建一个索引库
        4、关闭client对象
2、使用Java客户端设置Mappings
    步骤:
    1)创建一个Settings对象
    2)创建一个Client对象
    3)创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对象
    4)使用client向es服务器发送mapping信息
    5)关闭client对象
3、添加文档(一行数据)
    步骤:
    1)创建一个Settings对象
    2)创建一个Client对象
    3)创建一个文档对象,创建一个json格式的字符串或者使用XContentBuilder
    4)使用Client对象吧文档添加到索引库中
    5)关闭client


每一步都要创建一个client对象,所以将client单独提取出来。

  1. package com.itheima.es;
  2. import org.elasticsearch.client.transport.TransportClient;
  3. import org.elasticsearch.common.settings.Settings;
  4. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  5. import org.elasticsearch.common.xcontent.XContentBuilder;
  6. import org.elasticsearch.common.xcontent.XContentFactory;
  7. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import java.net.InetAddress;
  11. public class ElasticSearchClientTest {
  12. private TransportClient client;
  13. @Before
  14. public void init() throws Exception {
  15. //1、创建一个Settings对象
  16. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  17. //2、创建一个Client对象,创建一个TransportClient对象
  18. client = new PreBuiltTransportClient(settings)
  19. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301))
  20. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
  21. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  22. }
  23. @Test
  24. public void createIndex() throws Exception {
  25. //1、创建一个Settings对象,相当于是一个配置信息,主要配置集群的名称。
  26. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  27. //2、创建一个客户端Client对象
  28. TransportClient client = new PreBuiltTransportClient(settings);
  29. //向client中添加三个ip地址的端口号,防止一个服务器不好使然后出现bug
  30. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
  31. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
  32. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  33. //3、使用client对象创建一个索引库
  34. client.admin().indices().prepareCreate("index_hello").get();//index_hello索引名称、get()执行操作
  35. //4、关闭client对象
  36. client.close();
  37. }
  38. @Test
  39. public void setMappings() throws Exception {
  40. //3、创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对象
  41. /*
  42. {
  43. "article": {type名称,表名:文章
  44. "properties": {
  45. "id": {//字段
  46. "type": "long",
  47. "store": true
  48. // "index": "not_analyzed"
  49. },
  50. "title": {
  51. "type": "text",
  52. "store": true,
  53. "index": true,
  54. "analyzer": "ik_smart"//ik_max_word、standard
  55. },
  56. "content": {
  57. "type": "text",
  58. "store": true,
  59. "index": true,//analyzed
  60. "analyzer": "ik_smart"//ik_max_word、standard
  61. }
  62. }
  63. }
  64. }
  65. */
  66. XContentBuilder builder = XContentFactory.jsonBuilder()
  67. .startObject()
  68. .startObject("article")//type名称
  69. .startObject("properties")
  70. .startObject("id")
  71. .field("type", "long")
  72. .field("store", true)
  73. .endObject()
  74. .startObject("title")
  75. .field("type", "text")
  76. .field("store", true)
  77. .field("analyzer", "ik_smart")
  78. .endObject()
  79. .startObject("content")
  80. .field("type", "text")
  81. .field("store", true)
  82. .field("analyzer", "ik_smart")
  83. .endObject()
  84. .endObject()
  85. .endObject()
  86. .endObject();
  87. //4、使用client向es服务器发送mapping信息,使用client把mapping信息设置到索引库中
  88. client.admin().indices()
  89. .preparePutMapping("index_hello")//设置要做映射的索引,设置索引库名称
  90. .setType("article")//设置要做映射的type,设置type名称
  91. .setSource(builder)//mapping信息,可以是XContentBuilder对象也可以是json格式的字符串
  92. .get();
  93. //5、关闭client对象,关闭链接
  94. client.close();
  95. }
  96. @Test
  97. public void testAddDocument() throws Exception {
  98. //1)创建一个Settings对象
  99. //2)创建一个Client对象
  100. //public void init() throws Exception {...}
  101. //3)创建一个文档对象,创建一个json格式的字符串或者使用XContentBuilder
  102. XContentBuilder builder = XContentFactory.jsonBuilder()
  103. .startObject()
  104. .field("id", 2l)//long型数据 2l
  105. .field("title", "Cause I got a crush on you who you~")
  106. .field("content", "你是我的我是你的谁~")
  107. .endObject();
  108. //4)使用Client对象把文档对象添加到索引库中
  109. client.prepareIndex()
  110. .setIndex("index_hello")//设置索引名称
  111. .setType("article")//设置typr
  112. .setId("2")//设置文档的id,如果不设置id的话es会自动生成一个id
  113. .setSource(builder)//设置文档信息,builder对象或json串
  114. .get();//执行操作
  115. //5)关闭client客户端
  116. client.close();
  117. }
  118. }

06-添加文档的第二种方式

一、使用Java客户端管理ES
1、创建索引库
2、使用Java客户端设置Mappings
3、添加文档(一行数据)

4、添加文档第二种方式
    创建一个pojo类
    使用工具类把pojo转换成json字符串
    把文档写入索引库

  1. @Test
  2. public void testAddDocument2() throws Exception {
  3. //创建一个Article对象
  4. Article article = new Article();
  5. //设置对象的属性
  6. article.setId(3l);
  7. article.setTitle("再多一眼看一眼就会爆炸~");
  8. article.setContent("再近一点靠近点快被融化~");
  9. //把article对象转换成json格式的字符串
  10. ObjectMapper objectMapper = new ObjectMapper();
  11. String jsonDocument = objectMapper.writeValueAsString(article);
  12. System.out.println(jsonDocument);
  13. //使用client对象把文档写入索引库
  14. client.prepareIndex("index_hello", "article", "3")
  15. .setSource(jsonDocument, XContentType.JSON)
  16. .get();
  17. //关闭客户端
  18. client.close();
  19. }

07-索引库查询_根据id查询

一、使用Java客户端管理ES
1、创建索引库
2、使用Java客户端设置Mappings
3、添加文档(一行数据)
4、添加文档的第二种方式

二、使用ES客户端实现搜索
1、根据id搜索
    QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
2、根据Term查询(关键词)
    QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "北方");
3、QueryString查询方式(带分析的查询)
    QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("速度与激情").defaultField("title");
    查询步骤:
    1)创建一个Client对象
    2)创建一个查询对象,可以使用QueryBuilders工具类创建QueryBuilder对象
    3)使用client执行查询
    4)得到查询的结果
    5)取查询结果的总记录数
    6)取查询结果列表
    7)关闭client

  1. package com.itheima.es;
  2. import org.elasticsearch.action.search.SearchResponse;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.Settings;
  5. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  6. import org.elasticsearch.index.query.QueryBuilder;
  7. import org.elasticsearch.index.query.QueryBuilders;
  8. import org.elasticsearch.search.SearchHit;
  9. import org.elasticsearch.search.SearchHits;
  10. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  11. import org.junit.Before;
  12. import org.junit.Test;
  13. import java.net.InetAddress;
  14. import java.util.Iterator;
  15. import java.util.Map;
  16. public class SearchIndex {
  17. private TransportClient client;
  18. @Before
  19. public void init() throws Exception {
  20. //1、创建一个Settings对象
  21. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  22. //2、创建一个Client对象,创建一个TransportClient对象
  23. client = new PreBuiltTransportClient(settings)
  24. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301))
  25. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
  26. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  27. }
  28. @Test
  29. public void testSearchById() throws Exception {
  30. //1)创建一个client对象
  31. //public void init() throws Exception {}
  32. //2)创建一个查询对象,可以使用QueryBuilders工具类创建QueryBuilder对象
  33. QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
  34. //3)使用client执行查询
  35. SearchResponse searchResponse = client.prepareSearch("index_hello")
  36. .setTypes("article")
  37. .setQuery(queryBuilder)
  38. .get();
  39. //4)得到查询的结果
  40. SearchHits searchHits = searchResponse.getHits();
  41. //5)取查询结果的总记录数
  42. System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
  43. //6)取查询结果列表
  44. Iterator<SearchHit> iterator = searchHits.iterator();
  45. while (iterator.hasNext()) {
  46. SearchHit searchHit = iterator.next();
  47. //打印文档对象,以json格式输出
  48. System.out.println(searchHit.getSourceAsString());
  49. //取文档的属性
  50. System.out.println("---------------文档的属性");
  51. Map<String, Object> document = searchHit.getSource();
  52. System.out.println(document.get("id"));
  53. System.out.println(document.get("title"));
  54. System.out.println(document.get("content"));
  55. }
  56. //7)关闭client
  57. client.close();
  58. }
  59. }

 08-索引库查询_根据term查询

  1. package com.itheima.es;
  2. import org.elasticsearch.action.search.SearchResponse;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.Settings;
  5. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  6. import org.elasticsearch.index.query.QueryBuilder;
  7. import org.elasticsearch.index.query.QueryBuilders;
  8. import org.elasticsearch.index.query.TermQueryBuilder;
  9. import org.elasticsearch.search.SearchHit;
  10. import org.elasticsearch.search.SearchHits;
  11. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14. import java.net.InetAddress;
  15. import java.util.Iterator;
  16. import java.util.Map;
  17. public class SearchIndex {
  18. private TransportClient client;
  19. @Before
  20. public void init() throws Exception {
  21. //1、创建一个Settings对象
  22. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  23. //2、创建一个Client对象,创建一个TransportClient对象
  24. client = new PreBuiltTransportClient(settings)
  25. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301))
  26. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
  27. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  28. }
  29. private void search(QueryBuilder queryBuilder) throws Exception {
  30. //3)使用client执行查询
  31. SearchResponse searchResponse = client.prepareSearch("index_hello")
  32. .setTypes("article")
  33. .setQuery(queryBuilder)
  34. .get();
  35. //4)得到查询的结果
  36. SearchHits searchHits = searchResponse.getHits();
  37. //5)取查询结果的总记录数
  38. System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
  39. //6)取查询结果列表
  40. Iterator<SearchHit> iterator = searchHits.iterator();
  41. while (iterator.hasNext()) {
  42. SearchHit searchHit = iterator.next();
  43. //打印文档对象,以json格式输出
  44. System.out.println(searchHit.getSourceAsString());
  45. //取文档的属性
  46. System.out.println("---------------文档的属性");
  47. Map<String, Object> document = searchHit.getSource();
  48. System.out.println(document.get("id"));
  49. System.out.println(document.get("title"));
  50. System.out.println(document.get("content"));
  51. }
  52. //7)关闭client
  53. client.close();
  54. }
  55. @Test
  56. public void testSearchById() throws Exception {
  57. //1)创建一个client对象
  58. //public void init() throws Exception {}
  59. //2)创建一个查询对象,可以使用QueryBuilders工具类创建QueryBuilder对象
  60. QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
  61. search(queryBuilder);
  62. }
  63. @Test
  64. public void testQueryByTerm() throws Exception {
  65. //创建一个QueryBuilder对象
  66. //参数1:要搜索的字段
  67. //参数2:要搜索的关键词
  68. TermQueryBuilder queryBuilder = QueryBuilders.termQuery("title", "爆炸");
  69. //执行查询
  70. search(queryBuilder);
  71. }
  72. }

09-索引库查询_queryString查询

10-查询分页设置

01、插入数据

  1. @Test
  2. public void testAddDocument3() throws Exception {//批量添加数据
  3. for (int i = 4; i < 100; i++) {
  4. //创建一个Article对象
  5. Article article = new Article();
  6. //设置对象的属性
  7. article.setId(i);
  8. article.setTitle("再多一眼看一眼就会爆炸~" + i);
  9. article.setContent("再近一点靠近点快被融化~" + i);
  10. //把article对象转换成json格式的字符串
  11. ObjectMapper objectMapper = new ObjectMapper();
  12. String jsonDocument = objectMapper.writeValueAsString(article);
  13. System.out.println(jsonDocument);
  14. //使用client对象把文档写入索引库
  15. client.prepareIndex("index_hello", "article", i + "")
  16. .setSource(jsonDocument, XContentType.JSON)
  17. .get();
  18. }
  19. //关闭客户端
  20. client.close();
  21. }

02、设置分页

一、使用Java客户端管理ES
1、创建索引库
2、使用Java客户端设置Mappings
3、添加文档(一行数据)
4、添加文档的第二种方式

二、使用ES客户端实现搜索
1、根据id搜索
2、根据Term查询(关键词)
3、QueryString查询方式(带分析的查询)
4、分页的处理
    在client对象执行查询之前,设置分页信息。
    然后再执行查询
     //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                .setTypes("article")
                .setQuery(queryBuilder)
                //设置分页信息
                .setFrom(0)
                //每页显示的行数
                .setSize(5)
                .get();
    分页需要设置两个值,一个from、size
    from:起始的行号,从0开始。
    size:每页显示的记录数

11-查询结果高亮显示

一、使用Java客户端管理ES
1、创建索引库
2、使用Java客户端设置Mappings
3、添加文档(一行数据)
4、添加文档的第二种方式

二、使用ES客户端实现搜索
1、根据id搜索
2、根据Term查询(关键词)
3、QueryString查询方式(带分析的查询)
4、分页的处理
5、查询结果高亮显示
(1)高亮的配置
        1)设置高亮显示的字段
        2)设置高亮显示的前缀
        3)设置高亮显示的后缀
(2)在client对象执行查询之前,设置高亮显示的信息
(3)遍历结果列表时可以从结果中取高亮结果

01、查看高亮结果

给关键词的前后加上HTML标签作为前后缀。

02、高亮显示代码实现

  1. package com.itheima.es;
  2. import org.elasticsearch.action.search.SearchResponse;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.Settings;
  5. import org.elasticsearch.common.text.Text;
  6. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  7. import org.elasticsearch.index.query.QueryBuilder;
  8. import org.elasticsearch.index.query.QueryBuilders;
  9. import org.elasticsearch.index.query.TermQueryBuilder;
  10. import org.elasticsearch.search.SearchHit;
  11. import org.elasticsearch.search.SearchHits;
  12. import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
  13. import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
  14. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  15. import org.junit.Before;
  16. import org.junit.Test;
  17. import java.net.InetAddress;
  18. import java.util.Iterator;
  19. import java.util.Map;
  20. public class SearchIndex {
  21. private TransportClient client;
  22. @Before
  23. public void init() throws Exception {
  24. //1、创建一个Settings对象
  25. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  26. //2、创建一个Client对象,创建一个TransportClient对象
  27. client = new PreBuiltTransportClient(settings)
  28. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301))
  29. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
  30. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
  31. }
  32. private void search(QueryBuilder queryBuilder) throws Exception {
  33. //3)使用client执行查询
  34. SearchResponse searchResponse = client.prepareSearch("index_hello")
  35. .setTypes("article")
  36. .setQuery(queryBuilder)
  37. .get();
  38. //4)得到查询的结果
  39. SearchHits searchHits = searchResponse.getHits();
  40. //5)取查询结果的总记录数
  41. System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
  42. //6)取查询结果列表
  43. Iterator<SearchHit> iterator = searchHits.iterator();
  44. while (iterator.hasNext()) {
  45. SearchHit searchHit = iterator.next();
  46. //打印文档对象,以json格式输出
  47. System.out.println(searchHit.getSourceAsString());
  48. //取文档的属性
  49. System.out.println("---------------文档的属性");
  50. Map<String, Object> document = searchHit.getSource();
  51. System.out.println(document.get("id"));
  52. System.out.println(document.get("title"));
  53. System.out.println(document.get("content"));
  54. }
  55. //7)关闭client
  56. client.close();
  57. }
  58. @Test
  59. public void testSearchById() throws Exception {
  60. //1)创建一个client对象
  61. //public void init() throws Exception {}
  62. //2)创建一个查询对象,可以使用QueryBuilders工具类创建QueryBuilder对象
  63. QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
  64. search(queryBuilder);
  65. /*
  66. //3)使用client执行查询
  67. SearchResponse searchResponse = client.prepareSearch("index_hello")
  68. .setTypes("article")
  69. .setQuery(queryBuilder)
  70. .get();
  71. //4)得到查询的结果
  72. SearchHits searchHits = searchResponse.getHits();
  73. //5)取查询结果的总记录数
  74. System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
  75. //6)取查询结果列表
  76. Iterator<SearchHit> iterator = searchHits.iterator();
  77. while (iterator.hasNext()) {
  78. SearchHit searchHit = iterator.next();
  79. //打印文档对象,以json格式输出
  80. System.out.println(searchHit.getSourceAsString());
  81. //取文档的属性
  82. System.out.println("---------------文档的属性");
  83. Map<String, Object> document = searchHit.getSource();
  84. System.out.println(document.get("id"));
  85. System.out.println(document.get("title"));
  86. System.out.println(document.get("content"));
  87. }
  88. //7)关闭client
  89. client.close();*/
  90. }
  91. @Test
  92. public void testQueryByTerm() throws Exception {
  93. //创建一个QueryBuilder对象
  94. //参数1:要搜索的字段
  95. //参数2:要搜索的关键词
  96. TermQueryBuilder queryBuilder = QueryBuilders.termQuery("title", "爆炸");
  97. //执行查询
  98. search(queryBuilder);
  99. }
  100. @Test
  101. public void testQueryStringQuery() throws Exception {
  102. //创建一个QueryBuilder对象
  103. QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("爆炸").defaultField("title");
  104. //执行查询
  105. search(queryBuilder, "title");
  106. }
  107. private void search(QueryBuilder queryBuilder, String highLightField) throws Exception {
  108. HighlightBuilder highlightBuilder = new HighlightBuilder();
  109. highlightBuilder.field(highLightField);//高亮显示的字段
  110. highlightBuilder.preTags("<em>");//前缀
  111. highlightBuilder.postTags("</em>");//后缀
  112. //3)使用client执行查询
  113. SearchResponse searchResponse = client.prepareSearch("index_hello")
  114. .setTypes("article")
  115. .setQuery(queryBuilder)
  116. //设置分页信息
  117. .setFrom(0)//起始行号从0开始
  118. .setSize(5)//每一页显示的行数
  119. //设置高亮信息
  120. .highlighter(highlightBuilder)
  121. .get();
  122. //4)得到查询的结果
  123. SearchHits searchHits = searchResponse.getHits();
  124. //5)取查询结果的总记录数
  125. System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
  126. //6)取查询结果列表
  127. Iterator<SearchHit> iterator = searchHits.iterator();
  128. while (iterator.hasNext()) {
  129. SearchHit searchHit = iterator.next();
  130. //打印文档对象,以json格式输出
  131. System.out.println(searchHit.getSourceAsString());
  132. //取文档的属性
  133. System.out.println("---------------文档的属性");
  134. Map<String, Object> document = searchHit.getSource();
  135. System.out.println(document.get("id"));
  136. System.out.println(document.get("title"));
  137. System.out.println(document.get("content"));
  138. System.out.println("****************************高亮结果");
  139. Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
  140. System.out.println(highlightFields);
  141. //取title高亮显示的结果
  142. HighlightField field = highlightFields.get(highLightField);//取key
  143. Text[] fragments = field.getFragments();
  144. if (fragments != null) {
  145. String title = fragments[0].toString();
  146. System.out.println(title);
  147. }
  148. }
  149. //7)关闭client
  150. client.close();
  151. }
  152. }

高亮显示:

xxx.xxx.var——快速生成变量。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/881977
推荐阅读
相关标签
  

闽ICP备14008679号