typora-copy-images-to: img

day02_ES

学习目标

  1. 能够完成创建索引的操作
  2. 能够完成删除索引的操作
  3. 能够完成创建映射的操作
  4. 能够完成文档的增删改查
  5. 能够完成文档的分页操作
  6. 能够完成文档的高亮查询操作
  7. 能够搭建Spring Data ElasticSearch的环境
  8. 能够完成Spring Data ElasticSearch的基本增删改查操作
  9. 能够掌握基本条件查询的方法命名规则

第一章ElasticSearch常用编程操作

1.索引相关操作

为了方便,我们就在上一天的课程中的项目中来使用即可,创建一个测试类用作今天的测试

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class EsApplicationTest03 {
  4. @Autowired
  5. private TransportClient transportClient;
  6. @Autowired
  7. private ObjectMapper objectMapper;
  8. @Autowired
  9. private ElasticsearchTemplate elasticsearchTemplate;
  10. //@Autowired
  11. //private ArticleDao dao;
  12. }

1.1创建索引

  1. @Test
  2. public void createIndex() {
  3. //准备创建索引 ,指定索引名 执行创建的动作(get方法)
  4. transportClient.admin().indices().prepareCreate("blog03").get();
  5. }

1.2删除索引

  1. //删除索引
  2. @Test
  3. public void deleteIndex() {
  4. //准备删除索引 ,指定索引名 指定删除的动作(get)
  5. transportClient.admin().indices().prepareDelete("blog02").get();
  6. }

2.映射相关操作

2.1映射格式

  1. "mappings" : {
  2. "article" : {
  3. "properties" : {
  4. "id" : { "type" : "long","store":"true" },
  5. "title" : { "type" : "text","analyzer":"ik_smart","index":"true","store":"true" },
  6. "content" : { "type" : "text","analyzer":"ik_smart","index":"true","store":"true" }
  7. }
  8. }
  9. }

2.2创建映射

  1. @Test
  2. public void putMapping() throws Exception {
  3. //1.创建索引 如果已有索引 可以先删除再测试
  4. transportClient.admin().indices().prepareCreate("blog02").get();
  5. //2.创建映射
  6. XContentBuilder builder = XContentFactory.jsonBuilder()
  7. .startObject()
  8. .startObject("article")
  9. .startObject("properties")
  10. .startObject("id")
  11. .field("type", "long").field("store", "true")
  12. .endObject()
  13. .startObject("title")
  14. .field("type", "text").field("analyzer", "ik_smart").field("store", "true")
  15. .endObject()
  16. .startObject("content")
  17. .field("type", "text").field("analyzer", "ik_smart").field("store", "true")
  18. .endObject()
  19. .endObject()
  20. .endObject()
  21. .endObject();
  22. PutMappingRequest mapping = new PutMappingRequest("blog02").type("article").source(builder);
  23. transportClient.admin().indices().putMapping(mapping).get();
  24. }

elasticsearch-day02 - 图1

3.文档相关操作

3.1创建文档

3.1.1通过ObjctMapper进行创建
  1. //创建文档 /更新文档 使用的是ik分词器
  2. @Test
  3. public void createIndexAndDocument() throws Exception {
  4. //设置数据
  5. Article article = new Article();
  6. article.setTitle("华为手机很棒");
  7. article.setContent("华为手机真的很棒");
  8. article.setId(1L);
  9. IndexResponse indexResponse = transportClient
  10. .prepareIndex("blog02", "article", "1")
  11. .setSource(objectMapper.writeValueAsString(article), XContentType.JSON)
  12. .get();
  13. System.out.println(indexResponse);
  14. }

3.1.2使用xcontentBuidler方式进行创建
  • 提供JSON如下
  1. {
  2. "id": 1,
  3. "content": "华为手机真的很棒",
  4. "title": "华为手机很棒"
  5. }
  • 实现创建文档
  1. //创建使用JSON xcontentbuilder的方式来创建文档
  2. /**
  3. *
  4. * {
  5. "id": 1,
  6. "content": "华为手机真的很棒",
  7. "title": "华为手机很棒"
  8. }
  9. *
  10. * @throws Exception
  11. */
  12. @Test
  13. public void createDocumentByJsons() throws Exception{
  14. XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
  15. .startObject()
  16. .field("id",2)
  17. .field("content","华为手机真的很棒你猜猜")
  18. .field("title","华为手机很棒但是我现在真的忧桑")
  19. .endObject();
  20. IndexResponse indexResponse = transportClient.prepareIndex("blog02", "article", "2").setSource(xContentBuilder).get();
  21. System.out.println(indexResponse);
  22. }

3.2修改文档

注意

修改文档和新增文档一样。当存在相同的文档的唯一ID的时候,便是更新。

3.3删除文档

  1. //删除文档
  2. @Test
  3. public void deleteByDocument() {
  4. transportClient.prepareDelete("blog02", "article", "2").get();
  5. }

3.4查询文档

3.4.1墙裂推荐批量添加文档数据

批量添加数据,我们可能想到的是直接循环,然后每个循环里面去提交,但是这样的话,效率很低。我们采用批量添加的方式,一次性提交数据。

  1. //批量添加文档
  2. @Test
  3. public void createDocument() throws Exception {
  4. //构建批量添加builder
  5. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
  6. long start = System.currentTimeMillis();
  7. for (long i = 0; i < 100; i++) {
  8. //数据构建
  9. Article article = new Article();
  10. article.setTitle("华为手机很棒" + i);
  11. article.setContent("华为手机真的很棒啊" + i);
  12. article.setId(i);
  13. //转成JSON
  14. String valueAsString = objectMapper.writeValueAsString(article);
  15. //设置值
  16. IndexRequest indexRequest = new IndexRequest("blog02", "article", "" + i).source(valueAsString, XContentType.JSON);
  17. //添加请求对象buidler中
  18. bulkRequestBuilder.add(indexRequest);
  19. }
  20. //一次性提交
  21. BulkResponse bulkItemResponses = bulkRequestBuilder.get();
  22. long end = System.currentTimeMillis();
  23. System.out.println("消耗了:"+(end-start)/1000);
  24. System.out.println("获取状态:" + bulkItemResponses.status());
  25. if (bulkItemResponses.hasFailures()) {
  26. System.out.println("还有些--->有错误");
  27. }
  28. }

测试结果为:

elasticsearch-day02 - 图2

测是结果是2S秒钟就可以操作3000W条数据。

3.4.2文档的查询
  • 查询所有数据
  1. //查询所有
  2. @Test
  3. public void matchAllQuery() {
  4. //1.创建查询对象,设置查询条件,执行查询动作
  5. SearchResponse response = transportClient
  6. .prepareSearch("blog02")
  7. .setTypes("article")
  8. .setQuery(QueryBuilders.matchAllQuery())
  9. .get();
  10. //2.获取结果集
  11. SearchHits hits = response.getHits();
  12. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  13. //3.循环遍历结果 打印
  14. for (SearchHit hit : hits) {
  15. String sourceAsString = hit.getSourceAsString();
  16. System.out.println(sourceAsString);
  17. }
  18. }
  • queryStringQuery():字符串查询

注意:

  1. 使用它是先分词再进行查询的,而且默认不指定字段时,是使用默认的分词器default_fielddefaul anlzyer来进行查询,如果指定了字段,则使用之前的映射设置的分词器来进行分词,当然也可以指定分词器
  1. //如果不写任何查询字段,那么会默认使用默认的分词器进行分词查询。用的是standard的标准分词器 进行查询default_field default_analyzer
  2. // https://blog.csdn.net/u013795975/article/details/81102010
  3. //如果指定了某一个字段,则会使用之前映射中指定的分词器进行查询。
  4. //注意 他只能查询字符串类型数据,如果不指定字段,则会查询所有的字段的值
  5. @Test
  6. public void queryStringQuery() {
  7. //1.创建查询对象,设置查询条件,执行查询动作
  8. SearchResponse response = transportClient
  9. .prepareSearch("blog02")
  10. .setTypes("article")
  11. .setQuery(QueryBuilders.queryStringQuery("手机").field("title"))
  12. .get();
  13. //2.获取结果集
  14. SearchHits hits = response.getHits();
  15. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  16. //3.循环遍历结果 打印
  17. for (SearchHit hit : hits) {
  18. String sourceAsString = hit.getSourceAsString();
  19. System.out.println(sourceAsString);
  20. }
  21. }
  • termQuery词条查询
  1. Term 翻译成词条。这个我们称为词条查询
  2. 查询时,不分词,将其作为整体作为条件去倒排索引中匹配是否存在。 简述为:不分词,整体匹配查询
  1. //查询时,不分词,将其作为整体作为条件去倒排索引中匹配是否存在。 简述为:不分词,整体匹配查询
  2. @Test
  3. public void termQuery() {
  4. //1.创建查询对象,设置查询条件,执行查询动作
  5. SearchResponse response = transportClient
  6. .prepareSearch("blog02")
  7. .setTypes("article")
  8. .setQuery(QueryBuilders.termQuery("title", "手机"))
  9. .get();
  10. //2.获取结果集
  11. SearchHits hits = response.getHits();
  12. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  13. //3.循环遍历结果 打印
  14. for (SearchHit hit : hits) {
  15. String sourceAsString = hit.getSourceAsString();
  16. System.out.println(sourceAsString);
  17. }
  18. }
  • matchQuery

特点:先分词,再查询,可以指定任意数据类型。需要只当要查询的哪个字段

  1. //匹配查询
  2. //特点: 查询时,先进行分词,并分词之后再进行匹配查询将结果合并返回出来。它可以指定非字符串的查询,数字的都可以。简述为:先分词,再查询,可以指定任意数据类型
  3. @Test
  4. public void matchQuery() {
  5. //1.创建查询对象,设置查询条件,执行查询动作
  6. SearchResponse response = transportClient
  7. .prepareSearch("blog02")
  8. .setTypes("article")
  9. .setQuery(QueryBuilders.matchQuery("title","华为手机真的很棒啊9"))
  10. .get();
  11. //2.获取结果集
  12. SearchHits hits = response.getHits();
  13. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  14. //3.循环遍历结果 打印
  15. for (SearchHit hit : hits) {
  16. String sourceAsString = hit.getSourceAsString();
  17. System.out.println(sourceAsString);
  18. }
  19. }
  • multiMatch查询
  1. //多字段匹配查询
  2. @Test
  3. public void multiMatchQuery() {
  4. //1.创建查询对象
  5. //2.设置查询的条件
  6. //3.执行查询
  7. SearchResponse searchResponse = transportClient.prepareSearch("blog02").setTypes("article")
  8. //匹配查询
  9. // 参数1 指定要搜索的内容
  10. // 参数2 指定多个字段的名称
  11. .setQuery(QueryBuilders.multiMatchQuery("很棒", "content", "title"))
  12. .get();
  13. //4.获取结果
  14. SearchHits hits = searchResponse.getHits();
  15. System.out.println("总命中数:" + hits.getTotalHits());
  16. for (SearchHit hit : hits) {
  17. //5.打印
  18. System.out.println(hit.getSourceAsString());
  19. }
  20. }
  • wildcardQuery():模糊查询
  1. //模糊搜索: 也叫通配符搜索
  2. //? 表示任意字符 一定占用一个字符空间,相当于占位符
  3. //* 表示任意字符 可以占用也可以不占用
  4. @Test
  5. public void wildcardQuery() {
  6. //1.创建查询对象,设置查询条件,执行查询动作
  7. SearchResponse response = transportClient
  8. .prepareSearch("blog02")
  9. .setTypes("article")
  10. .setQuery(QueryBuilders.wildcardQuery("title", "手?"))
  11. .get();
  12. //2.获取结果集
  13. SearchHits hits = response.getHits();
  14. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  15. //3.循环遍历结果 打印
  16. for (SearchHit hit : hits) {
  17. String sourceAsString = hit.getSourceAsString();
  18. System.out.println(sourceAsString);
  19. }
  20. }
  • 相似度查询fuzzyQuery()
  1. //相似度查询 输入错误的单词也能搜索出来
  2. //
  3. @Test
  4. public void fuzzyQuery() {
  5. //1.创建查询对象,设置查询条件,执行查询动作
  6. SearchResponse response = transportClient
  7. .prepareSearch("blog02")
  8. .setTypes("article")
  9. .setQuery(QueryBuilders.fuzzyQuery("title", "eaasticsearch"))
  10. .get();
  11. //2.获取结果集
  12. SearchHits hits = response.getHits();
  13. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  14. //3.循环遍历结果 打印
  15. for (SearchHit hit : hits) {
  16. String sourceAsString = hit.getSourceAsString();
  17. System.out.println(sourceAsString);
  18. }
  19. }

elasticsearch-day02 - 图3

  • 范围查询rangeQuery()
  1. /**
  2. * 范围查询:如下代码 查询id 从0 到20之间的数据包含0 和20
  3. * from to
  4. * gt lt
  5. */
  6. @Test
  7. public void rangeQuery() {
  8. //1.创建查询对象,设置查询条件,执行查询动作
  9. SearchResponse response = transportClient
  10. .prepareSearch("blog02")
  11. .setTypes("article")
  12. .setQuery(QueryBuilders.rangeQuery("id").from(0,true).to(20,true))
  13. .get();
  14. //2.获取结果集
  15. SearchHits hits = response.getHits();
  16. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  17. //3.循环遍历结果 打印
  18. for (SearchHit hit : hits) {
  19. String sourceAsString = hit.getSourceAsString();
  20. System.out.println(sourceAsString);
  21. }
  22. }

3.4.3布尔查询boolQuery

3.4.3.1介绍

bool查询 也叫做多条件组合查询,指在搜索过程中我们可以指定多种条件进行查询,例如:在JD我想买手机并且价格在500-2000之间的并且是苹果这个品牌的手机等等。那么这里面就需要多种条件组合在一起再执行查询。

当然执行查询的条件不一定是 都要满足,有可能是或者的关系,有可能是并且的关系,也有可能是非的关系。

Elasticsearch中定义了以下几种条件满足关系:

  1. //MUST 必须满足条件 相当于AND
  2. //MUST_NOT 必须不满足条件 相当于 NOT
  3. //SHOULD 应该满足条件 相当于OR
  4. //FILTER 必须满足条件 区别于MUST 它在查询上下文中查询

3.4.3.2代码实现

需求:

  1. 查询title为手机的,并且id0-30之间的数据。

代码:

  1. //多条件组合查询
  2. //需求: 查询title为手机的,并且id在0-30之间的数据
  3. //MUST 必须满足条件 相当于AND
  4. //MUST_NOT 必须不满足条件 相当于 NOT
  5. //SHOULD 应该满足条件 相当于OR
  6. //FILTER 必须满足条件 区别于MUST 它在查询上下文中查询
  7. @Test
  8. public void boolquery() {
  9. //1.创建组合条件对象
  10. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  11. //2.创建条件1 和条件2 将这两个条件组合在一起
  12. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("id").from(0, true).to(30, true);
  13. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "手机");
  14. boolQueryBuilder
  15. .must(rangeQueryBuilder)
  16. .must(termQueryBuilder);
  17. //3.创建查询对象,设置查询条件,执行查询动作
  18. SearchResponse response = transportClient
  19. .prepareSearch("blog02")
  20. .setTypes("article")
  21. .setQuery(boolQueryBuilder)
  22. .get();
  23. //4.获取结果集
  24. SearchHits hits = response.getHits();
  25. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  26. //5.循环遍历结果 打印
  27. for (SearchHit hit : hits) {
  28. String sourceAsString = hit.getSourceAsString();
  29. System.out.println(sourceAsString);
  30. }
  31. }

3.4.5过虑器
  1. 过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。

MUST和FILTER的区别:

  1. MUST 必须满足某条件,但是需要查询和计算文档的匹配度的分数,速度要慢
  2. FILTER 必须满足某条件,但是不需要计算匹配度分数,那么优化查询效率,方便缓存。

如下使用了filter

  1. @Test
  2. public void boolquery() {
  3. //1.创建组合条件对象
  4. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  5. //2.创建条件1 和条件2 将这两个条件组合在一起
  6. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("id").from(0, true).to(30, true);
  7. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "手机");
  8. boolQueryBuilder
  9. .filter(rangeQueryBuilder)
  10. .filter(termQueryBuilder);
  11. //3.创建查询对象,设置查询条件,执行查询动作
  12. SearchResponse response = transportClient
  13. .prepareSearch("blog02")
  14. .setTypes("article")
  15. .setQuery(boolQueryBuilder)
  16. .get();
  17. //4.获取结果集
  18. SearchHits hits = response.getHits();
  19. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  20. //5.循环遍历结果 打印
  21. for (SearchHit hit : hits) {
  22. String sourceAsString = hit.getSourceAsString();
  23. System.out.println(sourceAsString);
  24. }
  25. }

3.4.6分页查询和排序
  • ES支持分页查询,传入两个参数:from和size。
    form:表示起始文档的下标,从0开始。
    size:查询的文档数量。

  • 可以在字段上添加一个或多个排序,支持在keyword、date、float等类型上添加,text类型的字段上默认是不允许添加排序。

  1. //排序和分页 每页显示2行记录
  2. //按照Id升序排列
  3. @Test
  4. public void pageAndSort() {
  5. //1.创建查询对象,设置查询条件,执行查询动作
  6. SearchResponse response = transportClient
  7. .prepareSearch("blog02")
  8. .setTypes("article")
  9. .setQuery(QueryBuilders.termQuery("title", "手机"))
  10. .setFrom(0)// (page -1)* rows
  11. .setSize(2)//rows
  12. .addSort("id", SortOrder.ASC)//升序
  13. .get();
  14. //2.获取结果集
  15. SearchHits hits = response.getHits();
  16. System.out.println("获取到的总命中数:" + hits.getTotalHits());
  17. //3.循环遍历结果 打印
  18. for (SearchHit hit : hits) {
  19. String sourceAsString = hit.getSourceAsString();
  20. System.out.println(sourceAsString);
  21. }
  22. }

3.5查询结果高亮操作

3.5.1 什么是高亮显示

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

  • 百度搜索关键字”传智播客”

elasticsearch-day02 - 图4

  • 京东商城搜索”笔记本”
    elasticsearch-day02 - 图5

  • 在百度搜索”elasticsearch”,查看页面源码分析
    elasticsearch-day02 - 图6
    elasticsearch-day02 - 图7

3.5.2高亮显示的html分析

通过开发者工具查看高亮数据的html代码实现:

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

使用<em>高亮内容</em>

3.5.3 高亮显示代码实现
  1. @Test
  2. public void hight() throws Exception {
  3. //1.创建高亮配置
  4. HighlightBuilder highlightBuilder = new HighlightBuilder();
  5. highlightBuilder.field("title").preTags("<em style=\"color:red\">").postTags("</em>");
  6. //2.创建查询对象,设置查询条件,设置高亮 执行查询
  7. SearchResponse response = transportClient
  8. .prepareSearch("blog02")
  9. .setTypes("article")
  10. .setQuery(QueryBuilders.termQuery("title", "手机"))
  11. .highlighter(highlightBuilder)
  12. .setFrom(0)// (page -1)* rows
  13. .setSize(2)//rows
  14. .addSort("id", SortOrder.ASC)//升序
  15. .get();
  16. //3.获取结果集
  17. SearchHits hits = response.getHits();
  18. //4.循环遍历结果获取高亮数据
  19. System.out.println("获取高亮数据:>>>>" + hits.getTotalHits());
  20. //5.存储高亮数据
  21. for (SearchHit hit : hits) {
  22. //6.打印
  23. String sourceAsString = hit.getSourceAsString();//该数据不高亮
  24. Article article = objectMapper.readValue(sourceAsString, Article.class);
  25. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  26. StringBuffer sb = new StringBuffer();
  27. if (highlightFields != null && highlightFields.size() > 0) {
  28. HighlightField highlightField = highlightFields.get("title");//获取title这个高亮数据
  29. if (highlightField.getFragments() != null) {
  30. for (Text text : highlightField.getFragments()) {
  31. sb.append(text.string());
  32. }
  33. }
  34. }
  35. if (sb.length() > 0) {
  36. article.setTitle(sb.toString());
  37. }
  38. System.out.println("文章的标题数据:" + article.getTitle());
  39. }
  40. }

第二章Spring Data ElasticSearch

1.Spring Data ElasticSearch简介

1.1什么是Spring Data

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

elasticsearch-day02 - 图8

elasticsearch-day02 - 图9

1.2什么是Spring Data ElasticSearch

  1. Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端JAVA API 进行封装 Spring DataElasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。官方网站:[http://projects.spring.io/spring-data-elasticsearch/](http://projects.spring.io/spring-data-elasticsearch/)

Spring boot 集成spring data elasticsearch的方式来开发更加的方便和快捷

2.Spring boot starter data elasticsearch入门

2.1需求

需求: 保存Article

步骤:

  1. 创建Maven工程(jar),在pom文件导入坐标
  2. 创建pojo, 添加注解进行映射
  3. 创建Dao接口继承ElasticsearchRepository
  4. 创建配置文件进行配置springboot自动进行配置
  5. 测试是否创建映射成功

2.2代码实现

  • 创建Maven工程(jar),导入坐标我们已经导入了
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>
  • 创建pojo, 添加注解
  1. /**
  2. * @Document:放置到类上
  3. * indexName = "blog1":表示索引的名称,(小写)
  4. * type = "article":表示类型
  5. * @Id:放置到字段id上
  6. * 表示该字段的值存放到索引库的_id字段上,表示主键
  7. * @Field:放置到字段上
  8. * store = true:表示该字段的值存储到索引库
  9. * index = true:表示该字段的值要建立索引用于搜索
  10. * analyzer = "ik_smart":建立索引的时候使用什么分词器
  11. * searchAnalyzer = "ik_smart":数据搜索的时候使用什么分词器(可以不写)
  12. * type = FieldType.Text:存放字段的数据类型
  13. */
  14. @Document(indexName = "blog03",type = "article")
  15. public class Article implements Serializable {
  16. @Id
  17. private Long id;
  18. @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text)
  19. private String title;
  20. @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text)
  21. private String content;
  22. public Article() {
  23. }
  24. public Article(long id, String title, String content) {
  25. this.id = id;
  26. this.title = title;
  27. this.content = content;
  28. }
  29. public Long getId() {
  30. return id;
  31. }
  32. public void setId(Long id) {
  33. this.id = id;
  34. }
  35. public String getTitle() {
  36. return title;
  37. }
  38. public void setTitle(String title) {
  39. this.title = title;
  40. }
  41. public String getContent() {
  42. return content;
  43. }
  44. public void setContent(String content) {
  45. this.content = content;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Article{" +
  50. "id=" + id +
  51. ", title='" + title + '\'' +
  52. ", content='" + content + '\'' +
  53. '}';
  54. }
  55. }
  • 创建Dao接口继承ElasticsearchRepository
  1. public interface ArticleDao extends ElasticsearchRepository<Article,Long>{
  2. }
  • springboot自动进行配置创建配置文件进行配置

elasticsearch-day02 - 图10

  • 测试
  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class EsApplicationTest03 {
  4. @Autowired
  5. private ElasticsearchTemplate elasticsearchTemplate;
  6. @Autowired
  7. private ArticleDao dao;
  8. //创建索引
  9. //创建映射
  10. @Test
  11. public void createMapping() {
  12. elasticsearchTemplate.createIndex(Article.class);
  13. elasticsearchTemplate.putMapping(Article.class);
  14. }
  15. }

3.Spring Data ElasticSearch常见操作

3.1CRUD

  • 新增,
  1. //创建文档/更新文档
  2. @Test
  3. public void createDocument() {
  4. Article article = new Article(1L, "你的手机很好看", "您的手机真的很好看");
  5. dao.save(article);
  6. }
  7. //批量创建文档
  8. @Test
  9. public void createDocumentS() {
  10. List<Article> articles = new ArrayList<Article>();
  11. for (long i = 0; i < 100; i++) {
  12. Article article = new Article(i, "你的手机很好看" + i, "您的手机真的很好看" + i);
  13. articles.add(article);
  14. }
  15. dao.saveAll(articles);
  16. }
  • 删除
  1. //删除文档
  2. @Test
  3. public void DeleteDocument() {
  4. dao.deleteById(1L);
  5. }
  • 更新; 没有id对应的数据,就是新增; 有当前id对应的数据,就是更新
  1. //创建文档/更新文档
  2. @Test
  3. public void createDocument() {
  4. Article article = new Article(1L, "你的手机很好看", "您的手机真的很好看");
  5. dao.save(article);
  6. }
  • 根据id查询
  1. //根据ID查询
  2. @Test
  3. public void selectById() {
  4. Article article = dao.findById(1L).get();
  5. System.out.println(article);
  6. }
  • 查询所有
  1. //查询所有文档
  2. @Test
  3. public void SelectDocument() {
  4. Iterable<Article> all = dao.findAll();
  5. for (Article article : all) {
  6. System.out.println(article);
  7. }
  8. }
  • 排序查询
  1. @Test
  2. //排序
  3. public void fun07(){
  4. Iterable<Article> iterable = articleDao.findAll( Sort.by(Sort.Order.asc("id")));
  5. for (Article article : iterable) {
  6. System.out.println(article);
  7. }
  8. }
  • 分页查询
  1. @Test
  2. public void selectAndPageSort() {
  3. //设置分页条件
  4. //参数1 当前页码 0 为第一页
  5. //参数2 每页显示的行
  6. //参数3 指定排序的条件 参数3.1 指定要排序的类型 参数3.2 指定要排序的字段
  7. Pageable pageable = PageRequest.of(0, 2, new Sort(Sort.Direction.ASC, "id"));
  8. Page<Article> articles = dao.findAll(pageable);
  9. System.out.println("总记录数:" + articles.getTotalElements());
  10. System.out.println("总页数:" + articles.getTotalPages());
  11. //获取当前页的集合
  12. List<Article> content = articles.getContent();
  13. for (Article article : content) {
  14. System.out.println(article);
  15. }
  16. }

3.2自定义查询

  • 常用查询命名规则 | 关键字 | 命名规则 | 解释 | 示例 | | —- | —- | —- | —- | | and | findByField1AndField2 | 根据Field1和Field2获得数据 | findByTitleAndContent | | or | findByField1OrField2 | 根据Field1或Field2获得数据 | findByTitleOrContent | | is | findByField | 根据Field获得数据 | findByTitle | | not | findByFieldNot | 根据Field获得补集数据 | findByTitleNot | | between | findByFieldBetween | 获得指定范围的数据 | findByPriceBetween | | lessThanEqual | findByFieldLessThan | 获得小于等于指定值的数据 | findByPriceLessThan |
  • 测试
  1. public interface ArticleDao extends ElasticsearchRepository<Article,Long>{
  2. //根据title模糊查询
  3. List<Article> findByTitleLike(String title);
  4. //根据title模糊查询,根据id降序
  5. List<Article> findByTitleLikeOrderByIdAsc(String title);
  6. //模块查询,排序加分页
  7. Page<Article> findByTitleLikeOrderByIdAsc(String title,Pageable pageable);
  8. }