已解决
使用Spring Data Elasticsearch 进行索引的增、删、改、查
来自网友在路上 176876提问 提问时间:2023-10-29 03:10:08阅读次数: 76
最佳答案 问答题库768位专家为你答疑解惑
一 Spring Data Elasticsearch 项目环境搭建
1.1 修改pom文件添加依赖
目前使用spring-boot-starter-parent版本为2.2.8.RELEASE
对应spring-data-elasticsearch版本为2.2.8.RELEASE,版本对应可以自行百度,如果不行直接用elasticsearch-rest-high-level-client工具类吧
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.8.RELEASE</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.5.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.5.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.5.0</version></dependency>
1.2 新建配置文件
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** ES配置类** @author lc* @version 1.0* @date 2022/3/25 10:53*/
@Configuration
public class ElasticSearchClientConfig {@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.1.100", 9200, "http")));return client;}
}
二 ElasticsearchTemplate的使用
2.1 创建实体类
@Document指定实体类和索引对应关系
indexName:索引名称type: 索引类型(从ES 7.0 开始已经过时了)shards: 主分片数量。从ES 7开始默认1replicas:复制分片数量。从ES 7开始默认1
@Id 指定主键
@Field指定普通属性
type: 对应Elasticsearch中属性类型。使用FiledType枚举可以快速获取。text类型能被分词keywords不能被分词index: 是否创建索引。作为搜索条件时index必须为trueanalyzer:指定分词器类型。
@Data
@Document(indexName = "student_index",shards = 1,replicas = 1)
public class Student {@Idprivate String id;@Field(type = FieldType.Keyword)private String name;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String desc;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String data;@Field(type = FieldType.Integer)private Integer age;
}
2.2 初始化索引
@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testvoid createIndex() {// 从 spring data es 4.0开始所有索引操作都在这个接口IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Student.class);// 是否存在,存在则删除if(indexOperations.exists()){indexOperations.delete();}// 创建索引indexOperations.create();// createMapping 根据实体类获取映射关系// putMapping 把映射关系添加到索引中Document mapping = indexOperations.createMapping(Student.class);indexOperations.putMapping(mapping);}
2.3 删除索引
/*** 删除索引*/@Testvoid deleteIndex() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Student.class);boolean delete = indexOperations.delete();System.out.println(delete);}
2.4 新增文档
- 新增单个文档
/*** 新增单个文档*/@Testvoid insert(){Student student = new Student();student.setAge(23);student.setData("123");student.setDesc("华为手机");student.setId("1");student.setName("张三");Student save = elasticsearchRestTemplate.save(student);System.out.println(save);}
- 批量新增
/*** 批量新增*/@Testvoid batchInsert(){List<Student> list = new ArrayList<>();list.add(new Student("2","李四","苹果手机","1",22));list.add(new Student("3","王五","oppo手机","2",24));list.add(new Student("4","赵六","voio手机","3",25));list.add(new Student("5","田七","小米手机","4",26));Iterable<Student> result = elasticsearchRestTemplate.save(list);System.out.println(result);}
2.5 删除操作
- 根据主键删除
/*** 根据主键删除*/@Testvoid deleteById() {// 根据id删除String delete = elasticsearchRestTemplate.delete("5", Student.class);System.out.println(delete);}
- 根据条件删除
/*** 根据查询条件删除*/@Testvoid delete() {QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("张三");Query query = new NativeSearchQuery(queryBuilder);ByQueryResponse QueryDelete = elasticsearchRestTemplate.delete(query, Student.class);System.out.println(QueryDelete);}
2.6 修改操作
- 全量替换
/*** 批量修改*/@Testvoid update(){Student student = new Student();student.setId("1");student.setAge(23);student.setData("99");student.setDesc("华为手机AND苹果手机");student.setName("张三");Student save = elasticsearchRestTemplate.save(student);System.out.println(save);}
- 部分修改
/*** 部分修改*/@Testvoid update2(){// ctx._source 固定写法String script = "ctx._source.age = 27;ctx._source.desc = 'oppo手机and苹果电脑'";UpdateQuery build = UpdateQuery.builder("3").withScript(script).build();IndexCoordinates indexCoordinates = IndexCoordinates.of("student_index");UpdateResponse update = elasticsearchRestTemplate.update(build, indexCoordinates);System.out.println(update.getResult());}
2.7 查询操作
- 根据主键查询
/*** 根据主键查查询*/@Testvoid searchById(){Student student = elasticsearchRestTemplate.get("3", Student.class);System.out.println(student);}
- 模糊查询
/*** 模糊查询*/@Testvoid LikeSearch(){QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("手机");Query query = new NativeSearchQuery(queryBuilder);SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 使用match_all查询所有文档
/*** 使用match_all查询所有文档*/@Testvoid matchAllSearch(){MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();Query query = new NativeSearchQuery(queryBuilder);SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 使用match查询文档
/*** 使用match查询文档*/@Testvoid matchSearch(){Query query = new NativeSearchQuery( QueryBuilders.matchQuery("name","张三"));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 使用match_phrase查询文档
/*** 使用match_phrase查询文档* 短语搜索是对条件不分词,但是文档中属性根据配置实体类时指定的分词类型进行分词。* 如果属性使用ik分词器,从分词后的索引数据中进行匹配。*/@Testvoid matchPhraseSearch(){Query query = new NativeSearchQuery( QueryBuilders.matchPhraseQuery("desc","电脑"));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 使用range查询文档
/*** 使用range查询文档*/@Testvoid rangeSearch(){Query query = new NativeSearchQuery( QueryBuilders.rangeQuery("age").gte("24").lte(29));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 多条件查询
/*** 多条件查询*/@Testvoid querysSearch(){BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();List<QueryBuilder> listQuery = new ArrayList<>();listQuery.add(QueryBuilders.matchQuery("name","张三"));listQuery.add(QueryBuilders.matchQuery("age","23"));boolQueryBuilder.must().addAll(listQuery);// 逻辑 与
// boolQueryBuilder.should().addAll(listQuery);// 逻辑 或BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();List<QueryBuilder> listQuery2 = new ArrayList<>();listQuery2.add(QueryBuilders.matchQuery("name","李四"));listQuery2.add(QueryBuilders.matchQuery("age","22"));boolQueryBuilder2.must().addAll(listQuery2);// 逻辑 与BoolQueryBuilder boolQueryBuilder3 = QueryBuilders.boolQuery();List<QueryBuilder> listQuery3 = new ArrayList<>();listQuery3.add(boolQueryBuilder);listQuery3.add(boolQueryBuilder2);boolQueryBuilder3.should().addAll(listQuery3);// 逻辑 或boolQueryBuilder3.must().addAll(listQuery3);// 逻辑 与NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(boolQueryBuilder3);SearchHits<Student> search = elasticsearchRestTemplate.search(nativeSearchQuery, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
- 分页与排序
/*** 分页查询*/@Testvoid pageSearch(){Query query = new NativeSearchQuery(QueryBuilders.matchAllQuery());// 排序query.addSort(Sort.by(Sort.Direction.DESC,"age"));// 分页query.setPageable(PageRequest.of(1,2));SearchHits<Student> searchHits = elasticsearchRestTemplate.search(query, Student.class);System.out.println(searchHits.getTotalHits());List<SearchHit<Student>> hitList = searchHits.getSearchHits();List<Student> listResult = new ArrayList<>();hitList.forEach(list->{listResult.add(list.getContent());});System.out.println(listResult);}
查看全文
99%的人还看了
相似问题
- 图数据库Neo4J 中文分词查询及全文检索(建立全文索引)
- 基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery
- Docker安装部署[8.x]版本Elasticsearch+Kibana+IK分词器
- Elasticsearch下载安装,IK分词器、Kibana下载安装使用,elasticsearch使用演示
- Docker安装部署Elasticsearch+Kibana+IK分词器
- 快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解
- Python中文分词、词频统计并制作词云图
- 从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇
- IK分词器如何修改支持跨版本ES
- docker安装es分词插件ik详情步骤
猜你感兴趣
版权申明
本文"使用Spring Data Elasticsearch 进行索引的增、删、改、查":http://eshow365.cn/6-27365-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: RSA:基于小加密指数的攻击方式与思维技巧
- 下一篇: 039-第三代软件开发-PDF阅读器