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操作

Spring Boot整合ElasticSearch和Mysql 附案例源码

Spring整合ElasticSearch

Spring轻松整合ElasticSearch

spring boot 整合Elasticsearch