之前开发用的elasticsearch 6,由于媳妇公司最近要使用elasticsearch7,所以写了一个demo。

发现elasticsearch6和7还是有一些区别的。

言归正传。本次使用的es版本是7.13.1版本,安装了ik分词器插件,这里省略了安装过程,如果就是想跑demo直接下载windows版本的,干净又卫生。

先看一下springboot支持的版本。这里随便选了2.5.9版本的springboot

引入相关jar包,既然有springboot-starter肯定用他的

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

按照之前开发6的经验直接配置文件添加

 卧槽。竟然过时了。不慌,还好是springboot自己的东西。没办法,翻一翻自动装配类找找感觉。

 

 看到propereties了。看来离胜利不远了再往下看

 

 卧槽。这不都帮我做完了吗。不愧是springboot。懒人最爱。那就配置上直接用。开始写demo

#Elasticsearch 配置
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
spring.elasticsearch.rest.username=elastic
spring.elasticsearch.rest.password=tongyu1956125

 创建实体类,这里和mybatis-plus用一个实体类,@Document标签不懂的百度吧。这里面和6还是有差别的。es6以前支持多个type,es6只支持1个type,es7已经移除type了。

@Data
@Document(indexName = "rm_policy_publication",replicas = 1,shards = 5)
public class RmPolicyPublication extends Model<RmPolicyPublication> {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @Field(type = FieldType.Keyword)
    @TableId(type = IdType.ID_WORKER_STR)
    private String id;

    /**
     * 标题
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String title;

    /**
     * 流水号
     */
    @Field(type = FieldType.Keyword) // 这个不分词 可以用于关键字查询  具体哪个需要分词 哪个不分词 你要自己确定
    private String serialNumber;

    /**
     * 发文字号
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String policyNumber;

    /**
     * 效力级别(0:中央级,1:国务院级,2:部委级,3:部委司局和直属事业单位级,4:省(直辖市、计划单列市)级,5:省(直辖市、计划单列市)属事业单位级,6:地市级,7:地市所属事业单位级,8:其他)
     */
    @Field(type = FieldType.Auto)
    private String effectiveLevel;

    /**
     * 效力级别id
     */
    @Field(type = FieldType.Auto)
    private Integer effectiveLevelId;

    /**
     * 省份
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String province;

    /**
     * 时效性(0:无有效期限,正在执行有效,1:有有效期限,正在执行有效,2:已废止)
     */
    @Field(type = FieldType.Auto)
    private String timely;
    @Field(type = FieldType.Auto)
    private Integer timelyId;

    /**
     * 发文单位分类(废弃)
     */
    private String issuerClass;

    /**
     * 公布机关
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String issuer;

    private Integer issuerId;

    /**
     * 协同发文单位
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String assIssuer;
    @Field(type = FieldType.Auto)
    private Integer assIssuerId;

    /**
     * 公布日期
     */
    @Field(type = FieldType.Date)
    private Date publicDate;

    /**
     * 实施日期
     */
    @Field(type = FieldType.Auto)
    private Date implementDate;

    /**
     * 废止时间
     */
    @Field(type = FieldType.Auto)
    private Date revocateDate;

    /**
     * 题注
     */
    @Field(type = FieldType.Auto)
    private String caption;

    /**
     * 主题词
     */
    @Field(type = FieldType.Keyword)
    private String keyword;

    /**
     * 主题分类(0:国家科技创新领导体制,1:科技成果转化,2:科技人才发展,3:产学研协同创新,4:中央财政科技计划和经费管理改革,5:科技治理制度,6:区域创新发展,7:科技开放合作,8:科技创新立法)
     */
    @Field(type = FieldType.Auto)
    private String titleClass;

    @Field(type = FieldType.Auto)
    private Integer titleClassId;

    /**
     * 公文类型(0:决定,1:通知,2:通报,3:报告,4:请示,5:批复,6:意见,7:函,8:会议纪要,9:命令(令),10:通告,11:议案,12:其他)
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String policyClass;

    @Field(type = FieldType.Auto)
    private Integer policyClassId;

    /**
     * 特色分类标识
     */
    @Field(type = FieldType.Auto)
    private String featuredClass;

    /**
     * 数据来源
     */
    @Field(type = FieldType.Auto)
    private String dataSource;

    /**
     * 正文
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String text;

    /**
     * 父级政策id
     */
    @Field(type = FieldType.Auto)
    private String parentPolicyid;

    /**
     * 专题id
     */
    @Field(type = FieldType.Auto)
    private String topicId;

    /**
     * 附件id
     */
    @Field(type = FieldType.Auto)
    private String attachId;

    /**
     * 审核状态(0:待审核,1:审核未通过,2:审核通过)
     */
    @Field(type = FieldType.Auto)
    private String status;

    /**
     * 是否删除(0:未删除,1:已删除)
     */
    @Field(type = FieldType.Auto)
    private String isDelete;

    /**
     * 点击量
     */
    @Field(type = FieldType.Auto)
    private Integer extend;
    @Field(type = FieldType.Auto)
    private Date createTime;
    @Field(type = FieldType.Auto)
    private String createId;
    @Field(type = FieldType.Auto)
    private String createName;

    /**
     * 是否废止旧政(0:是,1:否)
     */
    @Field(type = FieldType.Auto)
    private Integer isReplaceOld;

    /**
     * 同时废止旧政id
     */
    @Field(type = FieldType.Auto)
    private String oldpolicyId;

    /**
     * 旧政名称
     */
    @Field(type = FieldType.Auto)
    private String oldpolicyName;

    /**
     * 是否被新政替代(0:是,1:否)
     */
    @Field(type = FieldType.Auto)
    private Integer isReplaced;

    /**
     * 新政id
     */
    @Field(type = FieldType.Auto)
    private String newpolicyId;

    /**
     * 新政名称
     */
    @Field(type = FieldType.Auto)
    private String newpolicyName;
    @Field(type = FieldType.Auto)
    private String pdfId;
    @Field(type = FieldType.Auto)
    private String textNonformat;
    
}

创建dao使用springboot-data-jpa ,String是实体的主键。这样简单的CRUD都有了

@Component
public interface RmPolicyPublicationDao extends ElasticsearchRepository<RmPolicyPublication,String> {

}

 直接注入dao和template可以直接用,简直太方便了

    @Resource
    private RmPolicyPublicationDao rmPolicyPublicationDao;

    @Resource
    private ElasticsearchRestTemplate elasticsearchTemplate;

 随便写一个查询

 @Override
    public List<RmPolicyPublication> highQuery() {
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("text", "化部办");


        logger.info("DSL:{}",matchQueryBuilder.toString());
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(matchQueryBuilder)
                .withFields("text")
                .withHighlightFields(new HighlightBuilder.Field("text"))
                .withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>"));
        NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();

        SearchHits<RmPolicyPublication> search = elasticsearchTemplate.search(nativeSearchQuery, RmPolicyPublication.class);

        List<RmPolicyPublication> list = new ArrayList<>();
        List<SearchHit<RmPolicyPublication>> searchHits = search.getSearchHits();
        for (SearchHit<RmPolicyPublication> searchHit : searchHits) {
            Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
            //将高亮的内容填充到content中
            searchHit.getContent().setIssuer(highlightFields.get("text")==null ? searchHit.getContent().getIssuer():highlightFields.get("text").get(0));
            list.add(searchHit.getContent());
        }
        return list;
    }

完成了,剩下也没啥了  demo我直接扔 码云上了 自己看吧。

springboot-es-demo: springboot集成es7

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐