SpringBoot集成ES 7.6.2 并对字段进行中文和拼音分词处理

文章目录


前言

在最近做的流媒体项目中需要集成ES搜索引擎,目前ES最新版本为7.x版本,在以往的项目中我都采用的是spring集成的spring-data-es,使用自定义类集成elasticsearchRepository来实现crud操作,目前spring家族的更新较慢,采用es官网推荐的rest-client会有不错的效率提升


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么不用spring封装的spring-data-es?

这位博主进行较为详细的说明

简单的说明:
1.springdataes采用的即将废弃的TransportClient,而TransportClient在es7版本中已经为弃用
2.spring更新速度慢,但是在springboot2.3.0后已经支持到es7版本
3.hightLevelClient虽然crud操作较为麻烦,但是在语法上更像dsl语言,也就是说可以参考dsl语言进行编程
4.rest-client有两种客户端,版本低的采用low-level-client,版本能跟上的采用high-level-client

二、springboot集成es的两种方式

虽然我采用的是es推荐的client,但是这里也给出springdataes的方式

1.spring-data-es使用elasticsearch

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>

注意
springboot在2.3.0 才集成es 7.x版本,如果springboot是2.2.x版本需要手动指定es版本,因为2.2.x版本内置es为6.x版本,而springboot 2.1.x不建议使用es7.x版本,可能一些类找不到

我使用的是springboot 2.2.5版本,在代码中指定es版本

    <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.6.2</elasticsearch.version>
    </properties>

2.doc对象的注解

代码如下(示例):

@Data
@ApiModel("ES文件存储对象")
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "upload-file") //取消type,
public class UploadFileDoc {

    @Id
    private String id;

    @ApiModelProperty("原始文件名")
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String fileName;

    @ApiModelProperty("文件类型")
    @Field(type = FieldType.Keyword)
    private String type;

    @ApiModelProperty("缩略图")
    private String picUrl;

    @ApiModelProperty(value = "创建人")
    @Field(type = FieldType.Keyword)
    private String createBy;

    @Field(type = FieldType.Date)
    private Date createTime;
    
    @Field(type = FieldType.Date)
    private Date updateTime;
}

在@filed注解中指定分词器细粒度为ik_max_word,也可以指定ik_smart,这种注解方式只能指定单一的分词器,而拼音分词器,可以将ik_max_word替换为analyzer = "pinyin_analyzer"

在es7.x版本里不需要指定type类型,默认为_doc,在es8会废除type类型,原因是不同type是存储在同一个索引中,会影响lucene的压缩性能。

2.doc对象的注解

@Repository
public interface UploadFileDocRepository extends ElasticsearchRepository<UploadFileDoc,String> {
}

es中的index索引会在程序启动的时候扫描到这个类,并对该类指定的对象上的注解进行分析,从而创建对应的索引和字段,已经字段的类型

至此,在controller或者其他层调用UploadFileDocRepository 对象,进行crud操作


二、hightLevelClient对ES进行操作

1.doc对象

@Builder
@Data
@ApiModel("ES文件存储对象")
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "upload-file")
@Setting(settingPath = "uploadfile_setting.json")
@Mapping(mappingPath = "uploadfile_mapping.json")
public class UploadFileDoc {

    @Id
    private String id;

    @ApiModelProperty("原始文件名")
    //@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String fileName;

    @ApiModelProperty("文件类型")
    //@Field(type = FieldType.Keyword)
    private String type;

    @ApiModelProperty("缩略图")
    private String picUrl;

    @ApiModelProperty(value = "创建人")
    //@Field(type = FieldType.Keyword)
    private String createBy;

    //@Field(type = FieldType.Date)
    private Date createTime;

    //@Field(type = FieldType.Date)
    private Date updateTime;

}

2.中文,拼音分词器同时使用

springBoot提供多种字段映射方式,第一种说的是使用@Field注解对字段进行类型分类并指定分词器,但是这种方式不满足一些特定场景,现在使用@setting和@mapping指定json文件来实现

直接贴代码:

uploadfile_setting.json

{
  "index": {
    "number_of_shards" : "3",
    "number_of_replicas" : "1",
    "analysis": {
        "analyzer": {
          "default" : {
            "tokenizer" : "ik_max_word"
          },
          "pinyin_analyzer": {
            "tokenizer": "my_pinyin"
          }
        },
        "tokenizer": {
          "my_pinyin": {
            "type": "pinyin",
            //true:支持首字母
            "keep_first_letter": true,
            //false:首字母搜索只有两个首字母相同才能命中,全拼能命中
            //true:任何情况全拼,首字母都能命中
            "keep_separate_first_letter": false,
            //true:支持全拼  eg: 刘德华 -> [liu,de,hua]
            "keep_full_pinyin": true,
            "keep_original": true,
            //设置最大长度
            "limit_first_letter_length": 16,
            "lowercase": true,
            //重复的项将被删除,eg: 德的 -> de
            "remove_duplicated_term": true
          }
        }
      }
    }
}

setting 文件指定分片数,默认为5和1,指定默认分词器为ik分词器,拼音分词器为my_pinyin,并且设置my_pinyin的分词属性,该文件可以在百度找到。但是建议使用es-head来查看索引属性获取

uploadfile_mapping.json

该文件百度上很多都是错的,可能是版本问题,很多加上的mappings:{}字段,也有加上index和type名的字段,在项目启动时,会报格式错误,这就是为什么我推荐大家参考es-head里面,如果生成不了,可以使用第一种方式来生成后进行查看

{
  "properties": {
    "createBy": {
      "type": "keyword"
    },
    "createTime": {
      "type": "date"
    },
    "type": {
      "type": "keyword"
    },
    "fileName": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word",
      "fields": {
        "pinyin": {
          "type": "text",
          "term_vector": "with_positions_offsets",
          "analyzer": "pinyin_analyzer",
          "boost": 10.0
        }
      }
    }
  }
}

3.使用client进行crud操作

这篇博客写的很详细,并且例举了dsl对比

简单说,就是创建request作为参数来代入client方法中

比如: 删除 :创建 DeleteRequest 设置参数后 restHighLevelClient.delete(request, RequestOptions.DEFAULT);
更新:创建UpdateRequest 设置参数后 restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
其他高级查询,需要了解dsl语言来封装对象

特别提醒

ES对版本一致性要求较为严格,所以使用es7.x那么es服务器也建议采用对应的版本
1.分词器下载连接 https://github.com/medcl/elasticsearch-analysis-ik/releases
2.因为是同一哥们写的,所以ik和pinyin分词器在一起
3.pinyin分词器如果没有7.6.2版本,那么修改配置文件强行转为对应版本,否则肯定报错

安装es head插件

1.谷歌浏览器支持head插件,直接使用
2.自己安装,下载链接 https://codechina.csdn.net/mirrors/mobz/elasticsearch-head?utm_source=csdn_github_accelerator
3.自己安装需要node.js环境,因为下载包貌似是一个前端页面包,擦
4.node.js 下载链接 https://nodejs.org/en/download/
5.安装grunt,在node.js的目录使用cmd,输入命令npm install -g grunt -cli
6.进入head的根目录下,cmd 输入npm install对文件进行编译
7.在同样的根目录下cmd 输入 grunt server即可启动
8.wc,凭借我仅有的前端知识,npm run start 同样可以启动

总结

好好学习,es水很深,我拿捏不住

上一篇:.Net Core中使用ElasticSearch(一)


下一篇:ES 分词器简单应用