Spring Boot集成Elasticsearch

应用场景

用Elasticsearch进行进行存储、搜索和分析。主要存储对象是资源库的文件,包括图片、视频、文件、音频等。

安装ES

下载:https://www.elastic.co/downloads/elasticsearch。
解压后,进入bin目录,点击elasticsearch.bat即可启动

安装完成后输入localhost:9200看到下图返回结果即安装完成。
在这里插入图片描述

安装ik中文分词

github地址

https://github.com/medcl/elasticsearch-analysis-ik

选择和自己es版本对应的插件即可
解压后把整个文件夹放到es 的plugin目录下,重新启动es服务,插件安装完成

SpringBoot 集成 ES
引入依赖
      <!--es-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

设置配置文件

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300

实体类,@Document(indexName = “resources”, type = “entity”)说明了数据所对应的index和type

@Data
@Document(indexName = "resources", type = "entity")
public class ResourceEntity implements Serializable {
    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;

    @Field(type = FieldType.Keyword)
    private String uri;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String features;

    @Field(type = FieldType.Keyword)
    private String type;
}

ResourceRepository继承ElasticsearchRepository,在此可以自定义一些查询策略

@Repository
public interface ResourceRepository extends ElasticsearchRepository<ResourceEntity,String> {

}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private ResourceRepository resourceRepository;

    @Test
    public void createIndex() {
        // 创建索引,会根据Item类的@Document注解信息来创建
        elasticsearchTemplate.createIndex(ResourceEntity.class);
        // 配置映射,会根据Item类中的id、Field等字段来自动完成映射
        elasticsearchTemplate.putMapping(ResourceEntity.class);
    }

    @Test
    public void insert() {
        ResourceEntity resourceEntity = new ResourceEntity();
        resourceEntity.setName("zmt的照片");
        resourceEntity.setFeatures("zmt#照片#美#人像");
        resourceEntity.setType("photo");
        resourceEntity.setUri("/photo/1.png");
        resourceRepository.save(resourceEntity);
    }

    @Test
    public void query() {
        // 查询
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        queryBuilder.withQuery(QueryBuilders.matchQuery("features","美"));
        Iterable<ResourceEntity> items = resourceRepository.search(queryBuilder.build());
        items.forEach(item -> System.out.println("item = " + item));
    }
    
    @Test
    public void query2() {
        BoolQueryBuilder builder = QueryBuilders.boolQuery();

        //设置条件
        MatchQueryBuilder query = QueryBuilders.matchQuery("features","美");
        MatchQueryBuilder query2 = QueryBuilders.matchQuery("name","美");

        //将聚合条件设置入查询体之中
        builder.filter(QueryBuilders.matchQuery("type","photo"));
        builder.should(query);
        builder.should(query2);
        builder.minimumShouldMatch(1);
        Iterable<ResourceEntity> items = resourceRepository.search(builder);
        items.forEach(item -> System.out.println("item = " + item));
    }

}

bool查询的关键词

must
必须满足must子句的条件
filter
必须满足filter子句的条件
should
可能满足should子句的条件。minimum_should_match可以定义至少满足几个子句。
must_nout
必须不满足must_not定义的条件。

当should和must或filter共同使用时,需要加上minimum_should_match。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读