SpringBoot-ElasticSearch5.6.8操作

x33g5p2x  于2021-09-24 转载在 Spring  
字(39.8k)|赞(0)|评价(0)|浏览(704)

使用IDEA创建elasticsearch-study Maven工程

添加Maven

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.elasticsearch</groupId>
  4. <artifactId>elasticsearch</artifactId>
  5. <version>5.6.8</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.elasticsearch.client</groupId>
  9. <artifactId>transport</artifactId>
  10. <version>5.6.8</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.logging.log4j</groupId>
  14. <artifactId>log4j-to-slf4j</artifactId>
  15. <version>2.9.1</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.slf4j</groupId>
  19. <artifactId>slf4j-api</artifactId>
  20. <version>1.7.24</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.slf4j</groupId>
  24. <artifactId>slf4j-simple</artifactId>
  25. <version>1.7.21</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>log4j</groupId>
  29. <artifactId>log4j</artifactId>
  30. <version>1.2.12</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>junit</groupId>
  34. <artifactId>junit</artifactId>
  35. <version>4.12</version>
  36. </dependency>
  37. </dependencies>

创建索引index

  1. //创建索引
  2. @org.junit.Test
  3. public void test1() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. //创建名称为blog2的索引
  10. client.admin().indices().prepareCreate("blog2").get();
  11. //释放资源
  12. client.close();
  13. }

在运行前 先把集群打开 保证没有什么问题

然后运行java代码

我们查看 elasticsearch-head

可以发现索引添加成功了

创建映射mapping

有索引才能创建 mapping 映射 否则失败

  1. //创建映射
  2. @org.junit.Test
  3. public void test3() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. //创建表的格式
  10. XContentBuilder builder = XContentFactory.jsonBuilder()
  11. .startObject()
  12. .startObject("article") //指定article表
  13. .startObject("properties") //给article表添加字段
  14. //创建字段id 添加字段格式
  15. .startObject("id").field("type", "integer").field("store", "yes").endObject()
  16. //创建字段title 添加字段格式
  17. .startObject("title").field("type", "string").field("store", "yes").field("analyzer", "ik_smart").endObject()
  18. //创建字段content 添加字段格式
  19. .startObject("content").field("type", "string").field("store", "yes").field("analyzer", "ik_smart").endObject()
  20. .endObject() //结束第一个startObject
  21. .endObject() //结束第二个startObject
  22. .endObject();//结束第三个startObject
  23. // 创建映射blog2(必须保证blog2索引存在) 和给这个索引添加表article 然后将上面定义好的表格式 传递给表article
  24. PutMappingRequest mapping = Requests.putMappingRequest("blog2")
  25. .type("article").source(builder);
  26. client.admin().indices().putMapping(mapping).get();
  27. //释放资源
  28. client.close();
  29. }

建立文档document

必须保证 有 索引 和 类型(表) 的存在 以及给表进行mapping之后 才能进行 添加数据(文档)

  1. //创建文档(通过XContentBuilder)
  2. @org.junit.Test
  3. public void test4() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. //创建文档信息
  10. XContentBuilder builder = XContentFactory.jsonBuilder()
  11. .startObject()//开始
  12. .field("id", 1) //给字段id 赋值
  13. .field("title", "ElasticSearch是一个基于Lucene的搜索服务器") //给字段title 赋值
  14. .field("content",
  15. "它提供了一个分布式多用户能力的全文搜索引擎," +
  16. "基于RESTful web接口。Elasticsearch是用Java开发的," +
  17. "并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。" +
  18. "设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")//给字段content赋值
  19. .endObject();//结束
  20. // 建立文档对象
  21. /** * 参数一blog1:表示索引对象 * 参数二article:类型(表) * 参数三1:建立文档id ( 行对应的行号) */
  22. client.prepareIndex("blog2", "article", "1").setSource(builder).get();
  23. //释放资源
  24. client.close();
  25. }

建立文件的documend(实体类方式)

必须保证 有 索引 和 类型(表) 的存在 以及给表进行mapping之后 才能进行 添加数据(文档)

使用Jackson转换实

需要的Maven

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-core</artifactId>
  4. <version>2.9.8</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.fasterxml.jackson.core</groupId>
  8. <artifactId>jackson-databind</artifactId>
  9. <version>2.9.8</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.fasterxml.jackson.core</groupId>
  13. <artifactId>jackson-annotations</artifactId>
  14. <version>2.9.8</version>
  15. </dependency>

创建一个实体类

  1. public class Article {
  2. private Integer id;
  3. private String title;
  4. private String content;
  5. ..... get set
  6. }

添加文档(一条数据)

  1. //创建文档(通过实体转json)
  2. @org.junit.Test
  3. public void test5() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. // 给实体类赋值
  10. Article article = new Article();
  11. article.setId(2); //文档id 同时也作为 字段id
  12. article.setTitle("搜索工作其实很快乐");
  13. article.setContent("我们希望我们的搜索解决方案要快," +
  14. "我们希望有一个零配置和一个完全免费的搜索模式," +
  15. "我们希望能够简单地使用JSON通过HTTP的索引数据," +
  16. "我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百," +
  17. "我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。" +
  18. "Elasticsearch旨在解决所有这些问题和更多的问题。");
  19. //需要导入的包 import com.fasterxml.jackson.databind.ObjectMapper;
  20. ObjectMapper objectMapper = new ObjectMapper();
  21. // 建立文档 给blog索引 中article表内添加 一行数据
  22. client.prepareIndex("blog2", "article", article.getId().toString())
  23. //将实体类的内容转换为json格式 写入表中
  24. .setSource(objectMapper.writeValueAsString(article).getBytes(), XContentType.JSON).get();
  25. //释放资源
  26. client.close();
  27. }

查询文档term查询

查询指定表内所有指定字段内容 是否满足查询条件 满足就返回哪一行数据

注意 依据分词查询 通常用于数字,日期和枚举等结构化数据,

  1. @org.junit.Test
  2. public void testTermQuery() throws Exception{
  3. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  4. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  5. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  6. TransportClient client = new PreBuiltTransportClient(settings)
  7. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  8. //2、设置搜索条件
  9. SearchResponse searchResponse = client.prepareSearch("blog2")//要查询的索引
  10. //要查询的表
  11. .setTypes("article")
  12. //要查询的字段 和要查询的值
  13. .setQuery(QueryBuilders.termQuery("content", "搜索")).get();
  14. //3、遍历搜索结果数据
  15. SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
  16. System.out.println("查询结果有:" + hits.getTotalHits() + "条");
  17. Iterator<SearchHit> iterator = hits.iterator();
  18. while (iterator.hasNext()) {
  19. SearchHit searchHit = iterator.next(); // 每个查询对象
  20. System.out.println(searchHit.getSourceAsString()); // 打印每个查询出来的行
  21. System.out.println("title:" + searchHit.getSource().get("title"));//查询每行指定字段
  22. }
  23. //4、释放资源
  24. client.close();
  25. }

查询文档query_string查询

查询指定表内所有 内容 是否满足查询条件 满足就返回哪一行数据

以分词进行 匹配查询 通常用于文档匹配 标题匹配 … 等

  1. @org.junit.Test
  2. public void testStringQuery() throws Exception{
  3. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  4. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  5. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  6. TransportClient client = new PreBuiltTransportClient(settings)
  7. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  8. //2、设置搜索条件
  9. SearchResponse searchResponse = client.prepareSearch("blog2")//查询的索引
  10. .setTypes("article")//查询的表
  11. //需要查询的内容
  12. .setQuery(QueryBuilders.queryStringQuery("搜索")).get();
  13. //3、遍历搜索结果数据
  14. SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
  15. System.out.println("查询结果有:" + hits.getTotalHits() + "条");
  16. Iterator<SearchHit> iterator = hits.iterator();
  17. while (iterator.hasNext()) {
  18. SearchHit searchHit = iterator.next(); // 每个查询对象
  19. System.out.println(searchHit.getSourceAsString()); // 打印每个查询出来的行
  20. System.out.println("title:" + searchHit.getSource().get("title"));//查询每行指定字段
  21. }
  22. //4、释放资源
  23. client.close();
  24. }

使用文档ID查询文档

  1. @org.junit.Test
  2. public void testIdQuery() throws Exception {
  3. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  4. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  5. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  6. TransportClient client = new PreBuiltTransportClient(settings)
  7. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  8. //client对象为TransportClient对象
  9. SearchResponse response = client.prepareSearch("blog2")//要查询的索引
  10. .setTypes("article")//要查询的表
  11. //要查询的id
  12. .setQuery(QueryBuilders.idsQuery().addIds("2"))
  13. //执行查询
  14. .get();
  15. //3、遍历搜索结果数据
  16. SearchHits hits = response.getHits(); // 获取命中次数,查询结果有多少对象
  17. System.out.println("查询结果有:" + hits.getTotalHits() + "条");
  18. Iterator<SearchHit> iterator = hits.iterator();
  19. while (iterator.hasNext()) {
  20. SearchHit searchHit = iterator.next(); // 每个查询对象
  21. System.out.println(searchHit.getSourceAsString()); // 打印每个查询出来的行
  22. System.out.println("title:" + searchHit.getSource().get("title"));//查询每行指定字段
  23. }
  24. //4、释放资源
  25. client.close();
  26. }

查询文档分页操作

在查询前我们需要有大量的数据

批量插入数据

  1. @org.junit.Test
  2. //批量插入100条数据
  3. public void test9() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. ObjectMapper objectMapper = new ObjectMapper();
  10. for (int i = 1; i <= 100; i++) {
  11. // 描述json 数据
  12. Article article = new Article();
  13. article.setId(i);
  14. article.setTitle(i + "搜索工作其实很快乐");
  15. article.setContent(i
  16. + "我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");
  17. // 建立文档 向blog2索引中article表插入数据
  18. client.prepareIndex("blog2", "article", article.getId().toString())
  19. //.setSource(objectMapper.writeValueAsString(article)).get();
  20. .setSource(objectMapper.writeValueAsString(article).getBytes(),XContentType.JSON).get();
  21. }
  22. //释放资源
  23. client.close();
  24. }

分页查询

就和mysql数据库 分页一样效果

  1. @org.junit.Test
  2. //分页查询
  3. public void test10() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. // 搜索数据 查询blog2索引下面article表的所有内容 进行分页---
  10. SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article")
  11. .setQuery(QueryBuilders.matchAllQuery()); //默认显示0-10条
  12. // 设置setFrom和setSize 后上面默认显示失效 按照我们自己的规则来显示
  13. //setFrom():从第几条开始检索,默认是0。
  14. //setSize():每页最多显示的记录数。
  15. searchRequestBuilder.setFrom(0).setSize(5); //显示 0-5条数据
  16. SearchResponse searchResponse = searchRequestBuilder.get();
  17. SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
  18. System.out.println("查询结果有:" + hits.getTotalHits() + "条");
  19. Iterator<SearchHit> iterator = hits.iterator();
  20. while (iterator.hasNext()) {
  21. SearchHit searchHit = iterator.next(); // 每个查询对象
  22. System.out.println(searchHit.getSourceAsString()); // 打印每个查询出来的行
  23. System.out.println("id:" + searchHit.getSource().get("id"));//查询每行指定字段
  24. System.out.println("title:" + searchHit.getSource().get("title"));//查询每行指定字段
  25. System.out.println("content:" + searchHit.getSource().get("content"));//查询每行指定字段
  26. System.out.println("-----------------------------------------");
  27. }
  28. //释放资源
  29. client.close();
  30. }

查询结果高亮操作

什么是高亮

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

高亮显示代码实现

  1. @org.junit.Test
  2. //高亮查询
  3. public void test11() throws Exception{
  4. // 创建Client连接对象 就是你在elasticsearch.yml配置文件里设置的集群名称 cluster.name: my-elasticsearch
  5. Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
  6. //连接 127.0.0.1:9300 这个集群中指定的节点 而不是9200了 节点的端口号可以在 elasticsearch-head->信息->节点状态里查看
  7. TransportClient client = new PreBuiltTransportClient(settings)
  8. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  9. // 搜索数据
  10. SearchRequestBuilder searchRequestBuilder = client
  11. //查询blog2 中的article表内的title字段 中分词满足 搜索的行
  12. .prepareSearch("blog2").setTypes("article")
  13. .setQuery(QueryBuilders.termQuery("title", "搜索"));
  14. //设置高亮数据
  15. HighlightBuilder hiBuilder=new HighlightBuilder();
  16. hiBuilder.preTags("<font style='color:red'>"); //包裹需要高亮的 开始标签
  17. hiBuilder.postTags("</font>");//包裹需要高亮的 结束标签
  18. hiBuilder.field("title"); //要和termQuery指定查询的字段一致
  19. searchRequestBuilder.highlighter(hiBuilder); //将高亮添加到内容里
  20. //获得查询结果数据
  21. SearchResponse searchResponse = searchRequestBuilder.get();
  22. //获取查询结果集
  23. SearchHits searchHits = searchResponse.getHits();
  24. System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
  25. //遍历结果
  26. for(SearchHit hit:searchHits){
  27. System.out.println("String方式打印文档搜索内容:");
  28. System.out.println(hit.getSourceAsString());
  29. System.out.println("---------------------------------------------");
  30. System.out.println("Map方式打印高亮内容");
  31. System.out.println(hit.getHighlightFields());
  32. System.out.println("---------------------------------------------");
  33. System.out.println("遍历高亮集合,打印高亮片段:");
  34. //需要导入 import org.elasticsearch.common.text.Text;
  35. Text[] text = hit.getHighlightFields().get("title").getFragments();
  36. for (Text str : text) {
  37. System.out.println(str);
  38. }
  39. System.out.println("\n\n");
  40. }
  41. //释放资源
  42. client.close();
  43. }

SpringDataElasticSearch 使用

介绍

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data的官网:http://projects.spring.io/spring-data/

什么是Spring Data ElasticSearch

Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

官方网站:http://projects.spring.io/spring-data-elasticsearch/

SpringDataElasticSearch入门

导入Spring Data ElasticSearch的Maven

  1. <dependency>
  2. <groupId>org.elasticsearch</groupId>
  3. <artifactId>elasticsearch</artifactId>
  4. <version>5.6.8</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.elasticsearch.client</groupId>
  8. <artifactId>transport</artifactId>
  9. <version>5.6.8</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.logging.log4j</groupId>
  13. <artifactId>log4j-to-slf4j</artifactId>
  14. <version>2.9.1</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.slf4j</groupId>
  18. <artifactId>slf4j-api</artifactId>
  19. <version>1.7.24</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.slf4j</groupId>
  23. <artifactId>slf4j-simple</artifactId>
  24. <version>1.7.21</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>log4j</groupId>
  28. <artifactId>log4j</artifactId>
  29. <version>1.2.12</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>junit</groupId>
  33. <artifactId>junit</artifactId>
  34. <version>4.12</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>com.fasterxml.jackson.core</groupId>
  38. <artifactId>jackson-core</artifactId>
  39. <version>2.9.8</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>com.fasterxml.jackson.core</groupId>
  43. <artifactId>jackson-databind</artifactId>
  44. <version>2.9.8</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>com.fasterxml.jackson.core</groupId>
  48. <artifactId>jackson-annotations</artifactId>
  49. <version>2.9.8</version>
  50. </dependency>
  51. <!--Spring Data ElasticSearch-->
  52. <dependency>
  53. <groupId>org.springframework.data</groupId>
  54. <artifactId>spring-data-elasticsearch</artifactId>
  55. <version>3.0.5.RELEASE</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-test</artifactId>
  60. <version>5.0.4.RELEASE</version>
  61. </dependency>

创建applicationContext.xml配置文件,引入elasticsearch命名空间 和配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd ">
  3. <!-- 扫描Dao包,自动创建实例 -->
  4. <elasticsearch:repositories base-package="com.itheima.dao"/>
  5. <!-- 扫描Service包,创建Service的实体 -->
  6. <context:component-scan base-package="com.itheima.service"/>
  7. <!-- 配置elasticSearch的连接 -->
  8. <!-- cluster-nodes 需要连接的elasticsearch地址 cluster-name 需要连接的集群名称 -->
  9. <elasticsearch:transport-client id="client" cluster-nodes="localhost:9300" cluster-name="my-elasticsearch"/>
  10. <!-- 创建Client连接对象 -->
  11. <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
  12. <constructor-arg name="client" ref="client"></constructor-arg>
  13. </bean>
  14. </beans>

编写实体Article

  1. package com.itheima.entity;
  2. import org.springframework.data.annotation.Id;
  3. import org.springframework.data.elasticsearch.annotations.Document;
  4. import org.springframework.data.elasticsearch.annotations.Field;
  5. import org.springframework.data.elasticsearch.annotations.FieldType;
  6. //@Document 文档对象 (索引信息、文档类型 )
  7. @Document(indexName="blog3",type="article")
  8. public class Article {
  9. //@Id 文档主键 唯一标识
  10. @Id
  11. //@Field 每个文档的字段配置(类型、是否分词、是否存储、分词器 )
  12. @Field(store=true, index = false,type = FieldType.Integer)
  13. private Integer id;
  14. @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)
  15. private String title;
  16. @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)
  17. private String content;
  18. @Field(index=true,store=true,type = FieldType.Double)
  19. private Double price;
  20. public Double getPrice() {
  21. return price;
  22. }
  23. public void setPrice(Double price) {
  24. this.price = price;
  25. }
  26. public Integer getId() {
  27. return id;
  28. }
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32. public String getTitle() {
  33. return title;
  34. }
  35. public void setTitle(String title) {
  36. this.title = title;
  37. }
  38. public String getContent() {
  39. return content;
  40. }
  41. public void setContent(String content) {
  42. this.content = content;
  43. }
  44. @Override
  45. public String toString() {
  46. return "Article{" +
  47. "id=" + id +
  48. ", title='" + title + '\'' +
  49. ", content='" + content + '\'' +
  50. ", price=" + price +
  51. '}';
  52. }
  53. }

其中,注解解释如下:
@Document(indexName=“blob3”,type=“article”):
indexName:索引的名称(必填项)
type:索引的类型

@Id:主键的唯一标识

@Field(index=true,analyzer=“ik_smart”,store=true,searchAnalyzer=“ik_smart”,type = FieldType.text)
index:是否设置分词
analyzer:存储时使用的分词器
searchAnalyze:搜索时使用的分词器
store:是否存储
type: 数据类型

编写Dao

  1. package com.itheima.dao;
  2. import com.itheima.entity.Article;
  3. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {
  7. }

编写Service

接口

  1. package com.itheima.service;
  2. import com.itheima.entity.Article;
  3. public interface ArticleService {
  4. public void save(Article article);
  5. }

实现类

  1. package com.itheima.service.impl;
  2. import com.itheima.dao.ArticleRepository;
  3. import com.itheima.entity.Article;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. @Service
  7. public class ArticleServiceImpl implements ArticleService {
  8. @Autowired
  9. private ArticleRepository articleRepository;
  10. public void save(Article article) {
  11. articleRepository.save(article);
  12. }
  13. }

创建测试类SpringDataESTest

  1. import com.itheima.entity.Article;
  2. import com.itheima.service.ArticleService;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  7. import org.springframework.test.context.ContextConfiguration;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9. import javax.annotation.Resource;
  10. @RunWith(SpringJUnit4ClassRunner.class) //测试开始的时候自动创建Spring的应用上下文
  11. //@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试
  12. @ContextConfiguration(locations="classpath:applicationContext.xml")//注解来标注我们想要导入某些在容器里的bean。
  13. public class SpringDataESTest {
  14. @Autowired
  15. private ArticleService articleService;
  16. @Resource
  17. private TransportClient client;
  18. @Autowired
  19. private ElasticsearchTemplate elasticsearchTemplate;
  20. /**创建索引和映射*/
  21. @org.junit.Test
  22. public void createIndex(){
  23. elasticsearchTemplate.createIndex(Article.class);
  24. elasticsearchTemplate.putMapping(Article.class);
  25. }
  26. /**添加文档*/
  27. @org.junit.Test
  28. public void saveArticle(){
  29. Article article = new Article();
  30. article.setId(100);
  31. article.setTitle("测试SpringData ElasticSearch");
  32. article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 \n" +
  33. " Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎");
  34. articleService.save(article);
  35. }
  36. }

SpringDataElasticSearch的常用操作

使用Spring Data ElasticSearch 增删改查 方法测试

在上面入门案例基础上进行修改

ArticleService

  1. package com.itheima.service;
  2. import com.itheima.entity.Article;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. public interface ArticleService {
  6. //添加
  7. public void save(Article article);
  8. //删除
  9. public void delete(Article article);
  10. //查询全部
  11. public Iterable<Article> findAll();
  12. //分页查询
  13. public Page<Article> findAll(Pageable pageable);
  14. }

以上方法 都是Spring Data ElasticSearch默认方法

ArticleServiceImpl

  1. package com.itheima.service.impl;
  2. import com.itheima.dao.ArticleRepository;
  3. import com.itheima.entity.Article;
  4. import com.itheima.service.ArticleService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.domain.Page;
  7. import org.springframework.data.domain.Pageable;
  8. import org.springframework.stereotype.Service;
  9. @Service
  10. public class ArticleServiceImpl implements ArticleService {
  11. @Autowired
  12. private ArticleRepository articleRepository;
  13. public void save(Article article) {
  14. articleRepository.save(article);
  15. }
  16. public void delete(Article article) {
  17. articleRepository.delete(article);
  18. }
  19. public Iterable<Article> findAll() {
  20. Iterable<Article> iter = articleRepository.findAll();
  21. return iter;
  22. }
  23. public Page<Article> findAll(Pageable pageable) {
  24. return articleRepository.findAll(pageable);
  25. }
  26. }

SpringDataESTest

  1. import com.itheima.entity.Article;
  2. import com.itheima.service.ArticleService;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.domain.Page;
  7. import org.springframework.data.domain.PageRequest;
  8. import org.springframework.data.domain.Pageable;
  9. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  10. import org.springframework.test.context.ContextConfiguration;
  11. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  12. import javax.annotation.Resource;
  13. @RunWith(SpringJUnit4ClassRunner.class) //测试开始的时候自动创建Spring的应用上下文
  14. //@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试
  15. @ContextConfiguration(locations="classpath:applicationContext.xml")//注解来标注我们想要导入某些在容器里的bean。
  16. public class SpringDataESTest {
  17. @Autowired
  18. private ArticleService articleService;
  19. @Resource
  20. private TransportClient client;
  21. @Autowired
  22. private ElasticsearchTemplate elasticsearchTemplate;
  23. /**创建索引和映射*/
  24. @org.junit.Test
  25. public void createIndex(){
  26. elasticsearchTemplate.createIndex(Article.class);
  27. elasticsearchTemplate.putMapping(Article.class);
  28. }
  29. /**添加文档*/
  30. @org.junit.Test
  31. public void saveArticle(){
  32. Article article = new Article();
  33. article.setId(100);
  34. article.setTitle("测试SpringData ElasticSearch");
  35. article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 \n" +
  36. " Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎");
  37. articleService.save(article);
  38. }
  39. /**修改文档*/
  40. @org.junit.Test
  41. public void update(){
  42. Article article = new Article();
  43. article.setId(100);
  44. article.setTitle("elasticSearch 3.0版本发布...更新");
  45. article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
  46. articleService.save(article);
  47. }
  48. /**删除文档*/
  49. @org.junit.Test
  50. public void delete(){
  51. Article article = new Article();
  52. article.setId(100);
  53. articleService.delete(article);
  54. }
  55. /**批量插入*/
  56. @org.junit.Test
  57. public void save100(){
  58. for(int i=1;i<=100;i++){
  59. Article article = new Article();
  60. article.setId(i);
  61. article.setTitle(i+"elasticSearch 3.0版本发布..,更新");
  62. article.setContent(i+"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
  63. article.setPrice(i+1.0);
  64. articleService.save(article);
  65. }
  66. }
  67. /**查询全部**/
  68. @org.junit.Test
  69. public void findAll(){
  70. String condition = "版本";
  71. Iterable<Article> all = articleService.findAll();
  72. for(Article article: all){
  73. System.out.println(article);
  74. }
  75. }
  76. /**分页查询*/
  77. @org.junit.Test
  78. public void findAllPage(){
  79. //参数1 是页数 参数2是 每页显示多少条 (无须我们自己计算)
  80. Pageable pageable = PageRequest.of(2,10);
  81. Page<Article> page = articleService.findAll(pageable);
  82. for(Article article:page.getContent()){
  83. System.out.println(article);
  84. }
  85. }
  86. }

自定义条件查询

需要添加到 dao层 ArticleRepository接口里才能生效 然后我们在service中调用

自定义匹配规则方法

格式: findBy 固定 Title Content Name Available 这些 都可以换成你自己的字段 但是首字母大写

关键字解释方法
and根据Field1和Field2获得数据findByTitleAndContent(String title,String content);
or根据Field1或Field2获得数据findByTitleOrContent(String title,String content);
is根据Field获得数据findByTitle(String title);
not根据Field获得相反数据findByTitleNot(String title)
between获得指定范围的数据findByPriceBetween(double price1, double price2);
lessThanEqual获得小于等于指定值的数据findByPriceLessThan(double price);
GreaterThanEqual获得大于等于指定值的数据findByPriceGreaterThan(double price);
BeforefindByPriceBefore
AfterfindByPriceAfter
Like比较相识的数据findByNameLike
StartingWith以xx开头的 数据findByNameStartingWith(String Name);
EndingWith以xx结尾的 数据findByNameEndingWith(String Name);
Contains/Containing包含的 数据findByNameContaining(String Name);
In多 值匹配findByNameIn(Collection<String>names)
NotIn多 值 不匹配findByNameNotIn(Collection<String>names)
OrderBy排序 后的数据findByxxxxxOrderByNameDesc(String xxx );

比如: findByTitleAndContent 如果你的表中没有title字段和content那么就无效这个方法

列: List<Article> findByTitleAndContent(String title,String content);

获得指定范围的数据: 方法 findByPriceBetween

列: List<Article> findByPriceBetween(double price1, double price2);

获得小于等于指定值的数据

列: List<Article> findByPriceLessThan(double price);

特别提醒

如果不设置分页信息,上面方法默认带分页,每页显示10条数据。
如果设置分页信息,应该在方法中添加一个参数Pageable

列: Page<Article> findByTitle(String condition, Pageable pageable);

Pageable pageable = PageRequest.of(0, 15); //设置分页 默认是从0页开始。

Page<Article> page = articleService.findByTitle(condition,pageable);//获取数据

排序

findByxxxxxOrderByNameDesc(String Available );

findByxxxxx就是上面的查询字段的条件 比如 findByTitle findByTitleOrContent …

而Name 就是要排序的字段 必须为数值类型 而且不能是id(否则报错)

比如可以是:
@Field(index=true,store=true,type = FieldType.Double)
private Double price;

@Field里 不能加 analyzer=“ik_smart” 和 searchAnalyzer=“ik_smart” 否则报错

Desc 是倒叙 Asc是正序

结合起来就是: findByTitleOrContentOrderByNameDesc

下面会将上面部分方法 演示

更具上面的案例修改代码就行了

dao层接口ArticleRepository

  1. package com.itheima.dao;
  2. import com.itheima.entity.Article;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  6. import java.util.Collection;
  7. import java.util.List;
  8. public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {
  9. //根据title查询
  10. List<Article> findByTitle(String condition);
  11. //根据title 查询(含分页)
  12. Page<Article> findByTitle(String condition, Pageable pageable);
  13. //根据title and content获得数据
  14. List<Article> findByTitleAndContent(String title,String content);
  15. //根据title or content获得数据
  16. List<Article> findByTitleOrContent(String title,String content);
  17. //根据title 获取相反条件的数据
  18. List<Article> findByTitleNot(String title);
  19. //获取title 里包含的 数据
  20. List<Article> findByTitleContaining(String Name);
  21. //根据title 多 值匹配
  22. List<Article> findByTitleIn(Collection<String>names);
  23. //排序 依据TfindByTitle条件 查询出来的值 然后根据Price字段进行排序
  24. List<Article> findByTitleOrderByPriceAsc(String title );
  25. }

service层ArticleService

  1. package com.itheima.service;
  2. import com.itheima.entity.Article;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. import java.util.Collection;
  6. import java.util.List;
  7. public interface ArticleService {
  8. //保存
  9. public void save(Article article);
  10. //删除
  11. public void delete(Article article);
  12. //查询全部
  13. public Iterable<Article> findAll();
  14. //分页查询
  15. public Page<Article> findAll(Pageable pageable);
  16. //根据标题查询
  17. List<Article> findByTitle(String condition);
  18. //根据标题查询(含分页)
  19. Page<Article> findByTitle(String condition, Pageable pageable);
  20. //根据title and content获得数据
  21. List<Article> findByTitleAndContent(String title,String content);
  22. //根据title or content获得数据
  23. List<Article> findByTitleOrContent(String title,String content);
  24. //根据title 获取相反条件的数据
  25. List<Article> findByTitleNot(String title);
  26. //获取title 里包含的 数据
  27. List<Article> findByTitleContaining(String Name);
  28. //根据title 多 值匹配
  29. List<Article> findByTitleIn(Collection<String> names);
  30. //排序 依据TfindByTitle条件 查询出来的值 然后根据Price字段进行排序
  31. List<Article> findByTitleOrderByPriceAsc(String title );
  32. }

service层ArticleService的实现类ArticleServiceImpl

  1. package com.itheima.service.impl;
  2. import com.itheima.dao.ArticleRepository;
  3. import com.itheima.entity.Article;
  4. import com.itheima.service.ArticleService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.domain.Page;
  7. import org.springframework.data.domain.Pageable;
  8. import org.springframework.stereotype.Service;
  9. import java.util.Collection;
  10. import java.util.List;
  11. @Service
  12. public class ArticleServiceImpl implements ArticleService {
  13. @Autowired
  14. private ArticleRepository articleRepository;
  15. public void save(Article article) {
  16. articleRepository.save(article);
  17. }
  18. public void delete(Article article) {
  19. articleRepository.delete(article);
  20. }
  21. public Iterable<Article> findAll() {
  22. Iterable<Article> iter = articleRepository.findAll();
  23. return iter;
  24. }
  25. public Page<Article> findAll(Pageable pageable) {
  26. return articleRepository.findAll(pageable);
  27. }
  28. public List<Article> findByTitle(String condition) {
  29. return articleRepository.findByTitle(condition);
  30. }
  31. public Page<Article> findByTitle(String condition, Pageable pageable) {
  32. return articleRepository.findByTitle(condition,pageable);
  33. }
  34. @Override
  35. public List<Article> findByTitleAndContent(String title,String content){
  36. return articleRepository.findByTitleAndContent(title,content);
  37. }
  38. @Override
  39. public List<Article> findByTitleOrContent(String title, String content) {
  40. return articleRepository.findByTitleOrContent(title,content);
  41. }
  42. @Override
  43. public List<Article> findByTitleNot(String title) {
  44. return articleRepository.findByTitleNot(title);
  45. }
  46. @Override
  47. public List<Article> findByTitleContaining(String Name) {
  48. return articleRepository.findByTitleContaining(Name);
  49. }
  50. @Override
  51. public List<Article> findByTitleIn(Collection<String> names) {
  52. return articleRepository.findByTitleIn(names);
  53. }
  54. @Override
  55. public List<Article> findByTitleOrderByPriceAsc(String title ) {
  56. return articleRepository.findByTitleOrderByPriceAsc(title );
  57. }
  58. }

测试

  1. import com.itheima.entity.Article;
  2. import com.itheima.service.ArticleService;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.index.query.QueryBuilders;
  5. import org.elasticsearch.search.sort.SortBuilders;
  6. import org.elasticsearch.search.sort.SortOrder;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.data.domain.Page;
  10. import org.springframework.data.domain.PageRequest;
  11. import org.springframework.data.domain.Pageable;
  12. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  13. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
  14. import org.springframework.data.elasticsearch.core.query.SearchQuery;
  15. import org.springframework.test.context.ContextConfiguration;
  16. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  17. import javax.annotation.Resource;
  18. import java.util.ArrayList;
  19. import java.util.Collection;
  20. import java.util.List;
  21. @RunWith(SpringJUnit4ClassRunner.class) //测试开始的时候自动创建Spring的应用上下文
  22. //@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试
  23. @ContextConfiguration(locations="classpath:applicationContext.xml")//注解来标注我们想要导入某些在容器里的bean。
  24. public class SpringDataESTest {
  25. @Autowired
  26. private ArticleService articleService;
  27. @Resource
  28. private TransportClient client;
  29. @Autowired
  30. private ElasticsearchTemplate elasticsearchTemplate;
  31. /**创建索引和映射*/
  32. @org.junit.Test
  33. public void createIndex(){
  34. elasticsearchTemplate.createIndex(Article.class);
  35. elasticsearchTemplate.putMapping(Article.class);
  36. }
  37. /**添加文档*/
  38. @org.junit.Test
  39. public void saveArticle(){
  40. Article article = new Article();
  41. article.setId(100);
  42. article.setTitle("测试SpringData ElasticSearch");
  43. article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 \n" +
  44. " Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎");
  45. articleService.save(article);
  46. }
  47. /**修改文档*/
  48. @org.junit.Test
  49. public void update(){
  50. Article article = new Article();
  51. article.setId(100);
  52. article.setTitle("elasticSearch 3.0版本发布...更新");
  53. article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
  54. articleService.save(article);
  55. }
  56. /**删除文档*/
  57. @org.junit.Test
  58. public void delete(){
  59. Article article = new Article();
  60. article.setId(100);
  61. articleService.delete(article);
  62. }
  63. /**批量插入*/
  64. @org.junit.Test
  65. public void save100(){
  66. for(int i=1;i<=100;i++){
  67. Article article = new Article();
  68. article.setId(i);
  69. article.setTitle(i+"elasticSearch 3.0版本发布..,更新");
  70. article.setContent(i+"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
  71. article.setPrice(i+1.0);
  72. articleService.save(article);
  73. }
  74. }
  75. /**查询全部**/
  76. @org.junit.Test
  77. public void findAll(){
  78. String condition = "版本";
  79. Iterable<Article> all = articleService.findAll();
  80. for(Article article: all){
  81. System.out.println(article);
  82. }
  83. }
  84. /**分页查询*/
  85. @org.junit.Test
  86. public void findAllPage(){
  87. //参数1 是页数 参数2是 每页显示多少条 (无须我们自己计算)
  88. Pageable pageable = PageRequest.of(2,10);
  89. Page<Article> page = articleService.findAll(pageable);
  90. for(Article article:page.getContent()){
  91. System.out.println(article);
  92. }
  93. }
  94. // ---------------------------------自定义
  95. /**条件查询*/
  96. @org.junit.Test
  97. public void findByTitle(){
  98. String condition = "版本";
  99. List<Article> articleList = articleService.findByTitle(condition);
  100. for(Article article:articleList){
  101. System.out.println(article);
  102. }
  103. }
  104. /**条件分页查询*/
  105. @org.junit.Test
  106. public void findByTitlePage(){
  107. String condition = "版本";
  108. Pageable pageable = PageRequest.of(3,10);
  109. Page<Article> page = articleService.findByTitle(condition,pageable);
  110. for(Article article:page.getContent()){
  111. System.out.println(article);
  112. }
  113. }
  114. /**条件查询*/
  115. //根据Field1和Field2获得数据
  116. @org.junit.Test
  117. public void findByTitleAndContent(){
  118. String title = "版本";
  119. String content = "搜索服务器";
  120. List<Article> articleList = articleService.findByTitleAndContent(title,content);
  121. for(Article article:articleList){
  122. System.out.println(article);
  123. }
  124. }
  125. /**条件查询*/
  126. //根据Field1和Field2获得数据
  127. @org.junit.Test
  128. public void findByTitleOrContent(){
  129. String title = "版本";
  130. String content = "版本";
  131. List<Article> articleList = articleService.findByTitleOrContent(title,content);
  132. for(Article article:articleList){
  133. System.out.println(article);
  134. }
  135. }
  136. /**条件查询*/
  137. //根据title 获取相反条件的数据
  138. @org.junit.Test
  139. public void findByTitleNot(){
  140. String title = "14elasticSearch 3.0版本发布..,更新";
  141. List<Article> articleList = articleService.findByTitleNot(title);
  142. for(Article article:articleList){
  143. System.out.println(article);
  144. }
  145. }
  146. /**条件查询*/
  147. //根据title 获取相反条件的数据
  148. @org.junit.Test
  149. public void findByTitleContaining(){
  150. String title = "14";
  151. List<Article> articleList = articleService.findByTitleContaining(title);
  152. for(Article article:articleList){
  153. System.out.println(article);
  154. }
  155. }
  156. /**条件查询*/
  157. //根据title 多 值匹配
  158. @org.junit.Test
  159. public void findByTitleIn(){
  160. Collection<String> names= new ArrayList<>();
  161. names.add("版本");
  162. names.add("14");
  163. List<Article> articleList = articleService.findByTitleIn(names);
  164. for(Article article:articleList){
  165. System.out.println(article);
  166. }
  167. }
  168. /**条件查询*/
  169. //排序 根据title 来查询出来数据 然后依据Price进行 正序排序
  170. @org.junit.Test
  171. public void findByTitleOrderByPriceAsc(){
  172. String title = "版本";
  173. List<Article> articleList = articleService. findByTitleOrderByPriceAsc(title );
  174. for(Article article:articleList){
  175. System.out.println(article);
  176. }
  177. }

使用Elasticsearch的原生查询对象进行查询

  1. import com.itheima.entity.Article;
  2. import org.elasticsearch.index.query.Operator;
  3. import org.elasticsearch.index.query.QueryBuilders;
  4. import org.elasticsearch.search.sort.SortBuilders;
  5. import org.elasticsearch.search.sort.SortOrder;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.domain.PageRequest;
  9. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  10. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
  11. import org.springframework.data.elasticsearch.core.query.SearchQuery;
  12. import org.springframework.test.context.ContextConfiguration;
  13. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  14. import java.util.List;
  15. @RunWith(SpringJUnit4ClassRunner.class) //测试开始的时候自动创建Spring的应用上下文
  16. //@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试
  17. @ContextConfiguration(locations="classpath:applicationContext.xml")//注解来标注我们想要导入某些在容器里的bean。
  18. public class SpringDataESTest {
  19. @Autowired
  20. private ElasticsearchTemplate elasticsearchTemplate; //在applicationContext.xml里配置的
  21. @org.junit.Test
  22. public void findByNativeQuery() {
  23. //创建一个SearchQuery对象
  24. SearchQuery searchQuery = new NativeSearchQueryBuilder()
  25. //-----------------设置查询条件,此处可以使用QueryBuilders termQuery matchQuery 等 创建多种查询----------------
  26. //queryString查询 条件分词查询 默认or
  27. .withQuery(QueryBuilders.queryStringQuery("版本").defaultOperator(Operator.OR).defaultField("title"))
  28. //term 查询 精确分词查询 必须分词列表中有此词汇
  29. // .withQuery(QueryBuilders.termQuery("title", "版本"))
  30. //match 查询 模糊查询 在匹配前会对搜索词进行分词 然后逐一的 和分词列表进行匹配
  31. // .withQuery(QueryBuilders.matchQuery("title", "版本"))
  32. // ------------ 下面就是 对上面 匹配到的数据 进行 处理---------------------
  33. //设置分页信息(显示的条数)
  34. .withPageable(PageRequest.of(0, 50))
  35. //排序 更具price进行排序 正序
  36. .withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC))
  37. //创建SearchQuery对象
  38. .build();
  39. // --------------将 处理后的数据 打印
  40. //使用模板对象执行查询
  41. List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
  42. for(Article article:articles){
  43. System.out.println(article);
  44. }
  45. }
  46. }

相关文章