SpringBoot整合elasticsearch (java整合es)
欢迎大家进群,一起探讨学习
微信公众号,每天给大家提供技术干货
博主技术笔记
博主网站地址1
博主网站地址2
博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star
SpringBoot整合elasticsearch
pom引入
<!--elasticsearch--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
yml配置
spring:data:elasticsearch:rest:uris: ["ip:9200"]elasticsearch:cluster-name: docker-clustercluster-nodes: ip:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNodeproperties:path:logs: ./elasticsearch/log #elasticsearch日志存储目录data: ./elasticsearch/data #elasticsearch数据存储目录
配置只需这么些,接下来就写一些demo来玩一下elaseticsearch
构建Item类
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {@Idprivate Long id;//文章使用分词器@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title; //标题@Field(type = FieldType.Keyword)private String category;// 分类@Field(type = FieldType.Keyword)private String brand; // 品牌@Field(type = FieldType.Double)private Double price; // 价格}
创建ItemRepository并继承ElasticsearchRepository,有兴趣的可以看一下底层源码
public interface ItemRepository extends ElasticsearchRepository<Item,Long>{/*** @Description:根据价格区间查询 自定义查询* @Param price1* @Param price2*/List<Item> findByPriceBetween(double price1, double price2);List<Item> findByTitle(String title1);List<Item> findByTitleIn(Collection<String> ss);
}
创建索引
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BootApplication.class)
public class EsDemoApplicationTest{@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** @Description:创建索引,会根据Item类的@Document注解信息来创建*/@Testpublic void testCreateIndex() {elasticsearchRestTemplate.indexOps(Item.class).create();}/*** @Description:删除索引*/@Testpublic void testDeleteIndex() {elasticsearchRestTemplate.indexOps(Item.class).delete();}/*** @Description:判断索引是否存在*/@Testpublic void testExistIndex() {elasticsearchRestTemplate.indexOps(Item.class).exists();}/*** @Description:删除*/@Testpublic void delete() {elasticsearchRestTemplate.delete(1L, Item.class);}/*** 查询文档数据*/@Testpublic void getDoc() {Item item = elasticsearchRestTemplate.get(String.valueOf(1L), Item.class);System.out.println(item);}/*** 修改文档数据*/@Testpublic void updateDoc() {Map<String, Object> map = new HashMap<>();map.put("title", "abc");Document doc = Document.from(map);UpdateQuery updateQuery = UpdateQuery.builder(String.valueOf(1)).withDocument(doc).build();IndexCoordinates indexCoordinates = IndexCoordinates.of("item");elasticsearchRestTemplate.update(updateQuery, indexCoordinates);}/*** 分页搜索数据* 使用QueryBuilder* termQuery("key", obj) 完全匹配* termsQuery("key", obj1, obj2..) 一次匹配多个值* matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性* multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通配符忒行* matchAllQuery(); 匹配所有文件* idsQuery(); 只查询一个id的* fuzzyQuery(); 模糊查询 不能用通配符, 找到相似的*/@Testpublic void search() {Pageable pageable = PageRequest.of(0, 10);SortBuilder<FieldSortBuilder> sortBuilder = new FieldSortBuilder("price").order(SortOrder.DESC);NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().should(QueryBuilders.fuzzyQuery("title", "360"))).withPageable(pageable).withSort(sortBuilder).build();SearchHits<Item> search = elasticsearchRestTemplate.search(query, Item.class);System.out.println(search.getSearchHits());}/*** 高亮搜索*/@Testpublic void highlight() {String preTag = "<font color='red'>";String postTag = "</font>";NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("title", "360")).withHighlightFields(new HighlightBuilder.Field("title").preTags(preTag).postTags(postTag)).build();SearchHits<Item> searchHits = elasticsearchRestTemplate.search(query, Item.class);List<SearchHit<Item>> searchHitList = searchHits.getSearchHits();List<Map<String, Object>> hlList = new ArrayList<>();for (SearchHit h : searchHitList) {List<String> highlightField = h.getHighlightField("title");String nameValue = highlightField.get(0);String originalJson = JSON.toJSONString(h.getContent());JsonParser jj = new GsonJsonParser();Map<String, Object> myHighLight = jj.parseMap(originalJson);// 用高亮的搜索结果覆盖原字段值myHighLight.put("title", nameValue);System.out.println(myHighLight);hlList.add(myHighLight);}System.out.println(hlList);}/*** 高亮搜索 排序加分页*/@Testpublic void highlight1() {String preTag = "<font color='red'>";String postTag = "</font>";Pageable pageable = PageRequest.of(0, 10);SortBuilder<FieldSortBuilder> sortBuilder = new FieldSortBuilder("price").order(SortOrder.DESC);NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.fuzzyQuery("title", "360")).withPageable(pageable).withSort(sortBuilder).withHighlightFields(new HighlightBuilder.Field("title").preTags(preTag).postTags(postTag)).build();SearchHits<Item> searchHits = elasticsearchRestTemplate.search(query, Item.class);List<SearchHit<Item>> searchHitList = searchHits.getSearchHits();List<Map<String, Object>> hlList = new ArrayList<>();for (SearchHit h : searchHitList) {List<String> highlightField = h.getHighlightField("title");String nameValue = highlightField.get(0);String originalJson = JSON.toJSONString(h.getContent());JsonParser jj = new GsonJsonParser();Map<String, Object> myHighLight = jj.parseMap(originalJson);// 用高亮的搜索结果覆盖原字段值myHighLight.put("title", nameValue);hlList.add(myHighLight);}System.out.println(hlList);}
}
QueryBuilder构造ES查询条件使用规则
https://blog.csdn.net/csdn_20150804/article/details/105618933
第二种实现方式 RestHighLevelClient
package comn.hy.search.service.impl;import com.hy.search.Stu;
import com.hy.utils.JsonUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@RestController
public class TestServiceES {@Resourceprivate RestHighLevelClient client;/*** 创建索引* @throws IOException*/@PostMapping("create-index")public void createIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("user_index");CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);System.out.println(response);}/*** 获取索引信息* @throws IOException*/@GetMapping("query-index")public void queryIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("user_index");boolean b = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(b);}/*** 删除索引* @throws IOException*/@DeleteMapping("delete-index")public void deleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("user_index");AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}/*** 新增一个文档* @throws IOException*/@PostMapping("add-doc")public void addDoc() throws IOException {Stu stu = new Stu(10010L, "绝世风华", 18, 100.5f, true);IndexRequest request = new IndexRequest("user_index");// 规则 put /test_index/_doc/1request.id("1");request.timeout(new TimeValue(60, TimeUnit.SECONDS));request.source(JsonUtils.objectToJson(stu),XContentType.JSON);// 发送IndexResponse response = client.index(request,RequestOptions.DEFAULT);System.out.println(response.toString());System.out.println(response.status());}/*** 查询文档数据* @throws IOException*/@GetMapping("query-doc")void queryDoc() throws IOException {GetRequest request = new GetRequest("user_index","1");request.fetchSourceContext(new FetchSourceContext(false));request.storedFields("_none_");// 是否存在???boolean b = client.exists(request,RequestOptions.DEFAULT);System.out.println(b);// 获取GetResponse response = client.get(request,RequestOptions.DEFAULT);System.out.println(response.getSourceAsString());System.out.println(response);}/*** 更新文檔* @throws IOException*/@PutMapping("update-doc")public void updateDoc() throws IOException {UpdateRequest updateRequest = new UpdateRequest("user_index","1");updateRequest.timeout("1s");Stu stu = new Stu(10010L, "上善若水", 18, 100.5f, true);updateRequest.doc(JsonUtils.objectToJson(stu),XContentType.JSON);UpdateResponse response = client.update(updateRequest,RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());}/*** 删除文档* @throws IOException*/@DeleteMapping("delete-doc")public void deleteDoc() throws IOException {DeleteRequest deleteRequest = new DeleteRequest("user_index","1");deleteRequest.timeout("1s");DeleteResponse response = client.delete(deleteRequest,RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());}/*** 批量操作* @throws IOException*/@PostMapping("bulk-operator")public void bulkOperator() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("15s");Stu stu0 = new Stu(10010L, "诸天万界之起源传说", 18, 100.5f, true);Stu stu1 = new Stu(10011L, "寒夜", 20, 88.5f, true);Stu stu2 = new Stu(10012L, "陌上千寻雪", 22, 96.5f, false);Stu stu3 = new Stu(10013L, "可爱的漂亮的小哥哥", 26, 108.5f, false);Stu stu4 = new Stu(10014L, "灵纪传说", 28, 108.6f, true);Stu stu5 = new Stu(10015L, "狂剑天下之鸿蒙掌控", 16, 18.5f, false);Stu stu6 = new Stu(10016L, "逆战次元", 29, 100.5f, true);ArrayList<Stu> stuList = new ArrayList<>();stuList.add(stu0);stuList.add(stu1);stuList.add(stu2);stuList.add(stu3);stuList.add(stu4);stuList.add(stu5);stuList.add(stu6);for(int i = 0;i<=stuList.size();i++){bulkRequest.add(new IndexRequest("test.index").id(""+(i+1)).source(JsonUtils.objectToJson(stuList.get(i)), XContentType.JSON));}// 批量插入BulkResponse response = client.bulk(bulkRequest,RequestOptions.DEFAULT);System.out.println(response.hasFailures());}/*** 条件查询* @throws IOException*/@GetMapping("condition-search")public void conditionSearch() throws IOException {SearchRequest searchRequest = new SearchRequest("user_index");// 构造条件SearchSourceBuilder builder = new SearchSourceBuilder();// 精确匹配TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","绝世风华");// 匹配全部 matchAllQuery();builder.query(termQueryBuilder);// 分页builder.from(0);builder.size(10);builder.timeout(TimeValue.MINUS_ONE);searchRequest.source(builder);SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);System.out.println(JsonUtils.objectToJson(response.getHits()));for (org.elasticsearch.search.SearchHit hit : response.getHits().getHits()) {hit.getSourceAsMap().get("name");}}}
先执行创建索引
索引数据操作
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BootApplication.class)
public class ceshiTest {@Autowiredprivate ItemRepository itemRepository;/*** @Description:定义新增方法*/@Testpublic void insert() {Item item = new Item(1L, "小米手机7", " 手机","小米", 3499.00);itemRepository.save(item);}/*** @Description:定义批量新增方法*/@Testpublic void insertList() {List<Item> list = new ArrayList<>();list.add(new Item(1L, "小米9", "手机", "小米", 3299.00));list.add(new Item(2L, "华为pro30", "手机", "华为", 3999.00));list.add(new Item(3L, "一加7", "手机", "一加", 2999.00));list.add(new Item(4L, "魅族16", "手机", "魅族", 1999.00));list.add(new Item(5L, "苹果xs", "手机", "苹果", 5099.00));list.add(new Item(6L, "360pro", "手机", "360", 1099.00));list.add(new Item(7L, "荣耀V10", "手机", "华为", 899.00 ));// 接收对象集合,实现批量新增itemRepository.save(list);}/*** @Description:按照价格区间查询 自定义方法* 自定义方法Spring Data 的另一个强大功能,是根据方法名称自动实现功能。比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定 下边为约定And findByNameAndPriceOr findByNameOrPriceIs findByNameNot findByNameNotBetween findByPriceBetweenLessThanEqual findByPriceLessThanGreaterThanEqual findByPriceGreaterThanBefore findByPriceBeforeAfter findByPriceAfterLike findByNameLikeStartingWith findByNameStartingWithEndingWith findByNameEndingWithContains/Containing findByNameContainingIn findByNameIn(Collection<String>names)NotIn findByNameNotIn(Collection<String>names)Near findByStoreNearTrue findByAvailableTrueFalse findByAvailableFalseOrderBy findByAvailableTrueOrderByNameDesc* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void queryByPriceBetween(){List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);for (Item item : list) {System.out.println("item = " + item.getTitle());}}@Testpublic void queryByTitle(){List<Item> list = this.itemRepository.findByTitle("华为");for (Item item : list) {System.out.println("item = " + item.getTitle());}}@Testpublic void queryByTitleTo(){Collection<String> ss = new ArrayList<>();ss.add("华为");ss.add("小米");List<Item> list = this.itemRepository.findByTitleIn(ss);for (Item item : list) {System.out.println("item = " + item.getTitle());}}/*** @Description:matchQuery底层采用的是词条匹配查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testMatchQuery(){// 构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 添加基本分词查询queryBuilder.withQuery(QueryBuilders.matchQuery("title", "华为"));// 搜索,获取结果Page<Item> items = this.itemRepository.search(queryBuilder.build());// 总条数long total = items.getTotalElements();System.out.println("获取的总条数 = " + total);for (Item item : items) {System.out.println("手机名称是:"+item.getTitle());}}/*** @Description:* termQuery:功能更强大,除了匹配字符串以外,还可以匹配* int/long/double/float/....* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testTermQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.termQuery("price",1099));// 查找Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println("手机是:"+item.getTitle());}}/*** @Description:布尔查询 多条件查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testBooleanQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title","华为")).must(QueryBuilders.matchQuery("brand","华为")));// 查找Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println("手机名称是"+item.getTitle());}}/*** @Description:布尔查询 多条件查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testBlQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title","荣耀")).must(QueryBuilders.matchQuery("title","华为")));// 查找Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println("手机名称是"+item.getTitle());}}/*** @Description:模糊查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testFuzzyQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.fuzzyQuery("title","一"));Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println("手机名称是:"+item.getTitle());}}/*** @Description:分页查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void searchByPage(){// 构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 添加基本分词查询queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));// 分页:int page = 0;int size = 2;queryBuilder.withPageable(PageRequest.of(page,size));// 搜索,获取结果Page<Item> items = this.itemRepository.search(queryBuilder.build());// 总条数long total = items.getTotalElements();System.out.println("总条数 = " + total);// 总页数System.out.println("总页数 = " + items.getTotalPages());// 当前页System.out.println("当前页:" + items.getNumber());// 每页大小System.out.println("每页大小:" + items.getSize());for (Item item : items) {System.out.println(item.getTitle());}}/*** @Description:排序查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void searchAndSort(){// 构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 添加基本分词查询queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));// 排序queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));// 搜索,获取结果Page<Item> items = this.itemRepository.search(queryBuilder.build());// 总条数long total = items.getTotalElements();System.out.println("总条数 = " + total);for (Item item : items) {System.out.println("手机的价格是:"+item.getTitle()+":"+item.getPrice());}}/*** @Description:按照品牌brand进行分组* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testAgg(){NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 不查询任何结果queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));// 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brandqueryBuilder.addAggregation(AggregationBuilders.terms("brands").field("brand"));// 2、查询,需要把结果强转为AggregatedPage类型AggregatedPage<Item> aggPage = (AggregatedPage<Item>) this.itemRepository.search(queryBuilder.build());// 3、解析// 3.1、从结果中取出名为brands的那个聚合,// 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型StringTerms agg = (StringTerms) aggPage.getAggregation("brands");// 3.2、获取桶List<StringTerms.Bucket> buckets = agg.getBuckets();// 3.3、遍历for (StringTerms.Bucket bucket : buckets) {// 3.4、获取桶中的key,即品牌名称System.out.println(bucket.getKeyAsString());// 3.5、获取桶中的文档数量System.out.println(bucket.getDocCount());}}/*** @Description:嵌套聚合,求平均值* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testSubAgg(){NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 不查询任何结果queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));// 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brandqueryBuilder.addAggregation(AggregationBuilders.terms("brands").field("brand").subAggregation(AggregationBuilders.avg("priceAvg").field("price")) // 在品牌聚合桶内进行嵌套聚合,求平均值);// 2、查询,需要把结果强转为AggregatedPage类型AggregatedPage<Item> aggPage = (AggregatedPage<Item>) this.itemRepository.search(queryBuilder.build());// 3、解析// 3.1、从结果中取出名为brands的那个聚合,// 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型StringTerms agg = (StringTerms) aggPage.getAggregation("brands");// 3.2、获取桶List<StringTerms.Bucket> buckets = agg.getBuckets();// 3.3、遍历for (StringTerms.Bucket bucket : buckets) {// 3.4、获取桶中的key,即品牌名称 3.5、获取桶中的文档数量System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");// 3.6.获取子聚合结果:InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg");System.out.println("平均售价:" + avg.getValue());}}
}
SpringBoot整合elasticsearch (java整合es)相关推荐
- 【呕血整合】Java整合诸葛IO官方API获取埋点数据
前言 首先要特别感谢诸葛io官方人员的技术支持 近期小编有在网上查看Java整合诸葛io的相关请求接口文档,但是查到的结果都不太如意,或许是官方文档给得太详细了,根本不需要参考这种相关的博客.但是为了 ...
- es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch
ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...
- SpringBoot整合最新Elasticsearch Java API Client 7.16教程
文章目录 前言 一.Elasticsearch和Kibana 7.16版本安装 二.pom.xml文件引入依赖 三.代码实例 总结 前言 最新在学习SpringBoot整合es的一些知识,浏览了网上的 ...
- SpringBoot 2.x (12):整合Elasticsearch
Elasticsearch:一个优秀的搜索引擎框架 搜索方面最基本的是SQL的like语句 进一步的有Lucene框架 后来有企业级的Solr框架 而Elasticsearch框架尤其适合于数据量特别 ...
- springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch
一.Elasticsearch概念 •以 员工文档 的形式存储为例:一个文档代表一个员工数据.存储数据到 ElasticSearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot进阶教程(七十三)整合elasticsearch
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- Springboot整合ES8(Java API Client)
在 Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient标记为弃用状态.同时推出了全新的 Java API客户端 Elas ...
- SpringBoot 整合ElasticSearch全文检索
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并作为Apa ...
最新文章
- CMAKE支持c99的两种方式
- 索引名 oracle,ORACLE 索引名称矫情
- sock使用UDP协议进行广播发送数据
- Reversing Ethereum Smart Contracts: Part 2
- 微软推出的Pylance,随着VS Code的更新,性能又前进了一步
- cdlinux miniwdep 配置无线网卡
- iOS10.3的新玩意儿
- Modeling and Analyzing the Influence of Chunk Size Variation on Bitrate Adaptation in DASH 名字解释0728
- 洛谷 刷题 深基部分题解(python版)-2022.01.29
- android 协程,Android 上的 Kotlin 协程
- [面试] 算法(二)—— 第一个出现一次的字符(第一个出现 k 次、出现最多次)
- java网站后台管理系统_java网站后台管理系统
- js代码里链接生成二维码
- Android中获取并设置屏幕亮度
- lambda 表达式forEach中获取元素下标
- 0002计算机组成原理与体系结构02
- 当在jup里面更新了数据源之后就 帅选不了数据 ,代码运行不了
- python复数的实部和虚部都是整数嘛_数字类型
- SoftWare Engineering -- WEEK.3
- 【论文笔记】ParaDetox:Detoxifification with Parallel Data