Spring整合ElasticSearch之通过注解动态配置Setting
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合ElasticSearch之通过注解动态配置Setting相关的知识,希望对你有一定的参考价值。
参考技术A springboot整合ElasticSearch遇到的坑,首先我这里先列一下我用到的版本,版本详情如下:1、springboot : 2.1.8.RELEASE
2、spring-data-elasticsearch-3.1.10.RELEASE
2、Elasticsearch:6.6.2
3、分词器:ik6.6.2版本
4、kibana-6.6.0
1.版本问题
这个不是我一个遇到,网上遇到这个问题的人很多,会找很久,版本找对会节省挺多时间的。
由于网上有很多安装配置的文章、视频,我在这里就不多说了,就在这里简单说一下通过注解动态配置Setting。
2、通过注解动态配置Setting
由于我用的是动态生成索引,所以就通过注解的方式进行设置setting.,特别是做自动补全、推荐时就要进行Put Settings
(一)、实体配置
@Document(indexName = "products", type = "_doc", shards = 1, replicas = 0)
@Setting(settingPath = "/json/settings/settings.json") // es设置用拼音补全
@Mapping(mappingPath = "/json/mappings/productIndex.json") // 解决IK分词不能使用问题
配置主要有三块:1,、定义自己的索引名称、类型、分片等相关属性。
2、Setting设置我们通用Setting的路径json文件 //es 设置自动补全、用拼音等通用属性
3、做映射、解决IK分词使用(也可通过@Field字段做)。
具体的实体内容根据自己项目的实体操作,下边在resources目录下创建自己的json文件就可以:如下图所示s
mappings是索引文件,跟自己搜索的映射设置,Settings中放通用的设置(当然你也可以通过kibana语句执行),
在写settings.json和mapping的实例如下:
Spring boot 整合 Elasticsearch
第一、安装Elasticsearch 请移步
本文Elasticsearch版本:6.4.2
第二、项目操作
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
实体类 indexName 可以当做数据库名 加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词
@Data @Document(indexName = "commodity") public class Commodity implements Serializable { @Id private String skuId; private String name; private String category; private Integer price; private String brand; private Integer stock; }
dao层
@Repository public interface CommodityRepository extends ElasticsearchRepository<Commodity, String> { }
service层
public interface CommodityService { long count(); Commodity save(Commodity commodity); void delete(Commodity commodity); Iterable<Commodity> getAll(); List<Commodity> getByName(String name); Page<Commodity> pageQuery(Integer pageNo, Integer pageSize, String kw); }
实现类
@Service public class CommodityServiceImpl implements CommodityService { @Autowired private CommodityRepository commodityRepository; @Override public long count() { return commodityRepository.count(); } @Override public Commodity save(Commodity commodity) { return commodityRepository.save(commodity); } @Override public void delete(Commodity commodity) { commodityRepository.delete(commodity); // commodityRepository.deleteById(commodity.getSkuId()); } @Override public Iterable<Commodity> getAll() { return commodityRepository.findAll(); } @Override public List<Commodity> getByName(String name) { List<Commodity> list = new ArrayList<>(); MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name); Iterable<Commodity> iterable = commodityRepository.search(matchQueryBuilder); iterable.forEach(e->list.add(e)); return list; } @Override public Page<Commodity> pageQuery(Integer pageNo, Integer pageSize, String kw) { SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchPhraseQuery("name", kw)) .withPageable(PageRequest.of(pageNo, pageSize)) .build(); return commodityRepository.search(searchQuery); } }
controller类
@RestController @RequestMapping(value = "/es") public class ESController { @Autowired private CommodityService commodityService; @RequestMapping("/testInsert") public void testInsert() { Commodity commodity = new Commodity(); commodity.setSkuId("1501009001"); commodity.setName("原味切片面包(10片装)"); commodity.setCategory("101"); commodity.setPrice(880); commodity.setBrand("良品铺子"); commodityService.save(commodity); commodity = new Commodity(); commodity.setSkuId("1501009002"); commodity.setName("原味切片面包(6片装)"); commodity.setCategory("101"); commodity.setPrice(680); commodity.setBrand("良品铺子"); commodityService.save(commodity); commodity = new Commodity(); commodity.setSkuId("1501009004"); commodity.setName("元气吐司850g"); commodity.setCategory("101"); commodity.setPrice(120); commodity.setBrand("百草味"); commodityService.save(commodity); } @RequestMapping(value = "/testGetByName") public Result testGetByName(String name) { List<Commodity> list = commodityService.getByName(name); return new Result(Result.STATE_SUCCESS,list); } @RequestMapping(value = "/testPage") public Result testPage() { Page<Commodity> page = commodityService.pageQuery(0, 10, "切片"); System.out.println(page.getTotalPages()); System.out.println(page.getNumber()); System.out.println(page.getContent()); return new Result(Result.STATE_SUCCESS,page); }
application.yml配置信息 cluster-name 必须和elasticsearch.yml的cluster.name 一样
spring: application: name: qxgf-elasticsearch data: elasticsearch: cluster-nodes: 127.0.0.1:9300 cluster-name: qxgf-es repositories: enabled: true
测试
以上是关于Spring整合ElasticSearch之通过注解动态配置Setting的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch之hello(spring data整合)
springboot检索之整合elasticsearch并使用spring-data操作