美文网首页
elasticsearch入门到放弃之spring data e

elasticsearch入门到放弃之spring data e

作者: zhaoyunxing | 来源:发表于2019-07-11 21:21 被阅读0次

    代码地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-elasticsearch/spring-boot-data-elasticsearch

    这篇主要是对上篇elasticsearch入门到放弃之springboot elasticsearch x-pack的补充,下面我将按照场景结合官方编写接口,同样我也是开启了x-pack安全认证

    系列文章

    参考文档

    环境信息、配置

    • jdk 1.8
    • elasticsearch 6.4.0
    • x-pack 6.4.0
    • spring-boot-starter-data-elasticsearch 6.4.0
    • spring-boot 2.1.0 (它默认带的elasticsearch是6.2.2的)

    pom.xml文件

     <!--修改es版本这样设置最简单-->
    <properties>
        <elasticsearch.version>6.4.0</elasticsearch.version>
    </properties>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>x-pack-transport</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    
    <!--这个好像要添加不然下载不到 spring-boot-starter-data-elasticsearch:6.4.0 -->
    <repository>
        <id>spring-libs-snapshot</id>
        <name>Spring Snapshot Repository</name>
        <url>https://repo.spring.io/libs-snapshot</url>
    </repository>
    

    application.yml配置

    spring:
      data:
        elasticsearch:
          repositories:
            enabled: true
          cluster-nodes: 127.0.0.1:9300 # 集群模式下用逗号分开
          cluster-name: elasticsearch
          properties:
            xpack.security.user: elastic:123456
    

    使用场景

    根据名称获取文章

    注意:如果返回值是Page对象则参数必须添加Pageable

    // 带分页信息 
    Page<Article> articles = articleService.findArticleByName("docker搭建", PageRequest.of(0, 5));
    
    // 只关心数据本身(使用场景还没有想到)
    List<Article> articles= articleService.findArticleByName(String name);
    

    根据名称获取文章,然后根据id和创建时间倒序

    注意:排序的时候不要用在字段类型是text上,具体原因看可能遇到的问题第一个

    // 按照`org.springframework.data.domain.Sort`来
    Page<Article> articles = articleService.findArticleByName("docker搭建", PageRequest.of(0, 5,Sort.by(Sort.Direction.DESC,"id","createTime")));
    
    // 按照命名规则来
    Page<Article> articles = articleService.findArticleByNameOrderByCreateTimeDesc("docker搭建", PageRequest.of(0, 5));
    

    统计文章名称出现次数

    使用场景好像没有,了解即可

     Long count = articleService.countArticleByName("docker搭建");
    

    删除文章

    有很多方法,我只写使用频率高的

    //无返回值删除
    articleService.deleteById("40");
    // 根据对象删除
    articleService.delete(new Article());
    //有返回值删除,只能针对主键
    List<Article> articles = articleService.deleteArticlesById("40");
    

    其他未验证的感觉没有使用场景的

    • 根据topfirst限制
    • 使用注解@Query

    可能遇到的问题

    • java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.

    这个问题是因为Sort的字段nametext类型的,按照官方fieldata的建议,它禁止这样操作,容易出现内存过大

    // fielddata = true 可以解决这个问题,但是可能带来oom问题
    @Field(type = FieldType.Text,fielddata = true,store = true, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String name;
    

    相关文章

      网友评论

          本文标题:elasticsearch入门到放弃之spring data e

          本文链接:https://www.haomeiwen.com/subject/kkujkctx.html