0


springboot集成ElasticSearch

elasticsearch 和mongo都是文档型的数据库,听的比较多,趁有时间了解学习一下,顺便记录分享一下, 操作之前建议先了解一下ES的接口操作方法,以及数据结构概念;

1、环境准备

JAVA 1.8

ElasticSearch:7.6.2

springboot:2.3.10.RELEASE

因为我的elasticsearch版本比较新,这里采用的springboot版本也高一点

2、引入相应的包, 这里版本保持和ES版本同步

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>transport</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-high-level-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>7.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.6.2</version>
        </dependency>

3、新增配置文件

#ES的连接地址,多个地址用逗号分隔, ES没有设置密码就是下面的这个默认密码
spring.elasticsearch.rest.uris=http://192.168.1.103:9200
spring.elasticsearch.rest.username=elastic
spring.elasticsearch.rest.password=changeme

4、新建对应的entry实体类和Repository类,提供了类似JPA的数据库Dao的操作方式,指定对应的分词方式,匹配规则使用ElasticsearchRestTemplate进行操作,简单的类似关系型操作可以使用Repository类提供的方法;

text类型:
会进行分词,分词后建立索引。【比如:对于‘佟永硕’,ik分词器的smart分词会自动将其分成佟、永、硕三个字符进行建立索引,所以单字符搜索可以搜索到,而比如‘永硕’则搜索不到】
支持模糊查询,支持准确查询。
不支持聚合查询
keyword类型:
不分词,直接建立索引。【依据此特点,可以使用keyword类型+wildcardQuery(通配查询)实现类似sql的like查询(模糊搜索)】
支持模糊查询,支持准确查询。
支持聚合查询

/**
 * Type 类型 7.x 之后以及废弃
 */
@Data
@Document(indexName = LifeCircleContentES.INDEX_NAME)
public class LifeCircleContentES {

    public static final String INDEX_NAME = "lifecircle";
    public static final String INDEX_TYPE = "content";

    @Id
    private Long id;

    /**
     * 搜索文本
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String searchText;

    /**
     * 创建时间
     */
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date createTime;

    /**
     * 更新时间
     */
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date updateTime;

}
@Repository
public interface LifeCircleContentESRepository extends ElasticsearchRepository<LifeCircleContentES, Long> {

}

5、新增document(类似关系型数据库的一行数据),建议主动设置一下id,自动生成的是没有规则的字符串

    @Test
    public void testAddEs(){
        LifeCircleContentES contentES = new LifeCircleContentES();
        contentES.setSearchText("庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百废具兴,乃重修岳阳楼,增其旧制,刻唐贤今人诗赋于其上,属予作文以记之。\n" +
                "予观夫巴陵胜状,在洞庭一湖。衔远山,吞长江,浩浩汤汤,横无际涯,朝晖夕阴,气象万千,此则岳阳楼之大观也,前人之述备矣。然则北通巫峡,南极潇湘,迁客骚人,多会于此,览物之情,得无异乎?\n" +
                "若夫淫雨霏霏,连月不开,阴风怒号,浊浪排空,日星隐曜,山岳潜形,商旅不行,樯倾楫摧,薄暮冥冥,虎啸猿啼。登斯楼也,则有去国怀乡,忧谗畏讥,满目萧然,感极而悲者矣。\n" +
                "至若春和景明,波澜不惊,上下天光,一碧万顷,沙鸥翔集,锦鳞游泳,岸芷汀兰,郁郁青青。而或长烟一空,皓月千里,浮光跃金,静影沉璧,渔歌互答,此乐何极!登斯楼也,则有心旷神怡,宠辱偕忘,把酒临风,其喜洋洋者矣。\n" +
                "嗟夫!予尝求古仁人之心,或异二者之为,何哉?不以物喜,不以己悲,居庙堂之高则忧其民,处江湖之远则忧其君。是进亦忧,退亦忧。然则何时而乐耶?其必曰“先天下之忧而忧,后天下之乐而乐”乎!噫!微斯人,吾谁与归?\n" +
                "时六年九月十五日。");
        contentES.setId(2l);
        lifeCircleContentESRepository.save(contentES);
        log.info(contentES.toString());
    }

6、查看新增document,也可以代码段match根据关键词检索

192.168.1.103:9200/lifecircle/_search

7、代码测试检索效果: 有两种方法,如果有mongo的话建议风格统一用第一种

    @Test
    public void testSearchEs(){
        //类似 mongo的 template的操作 第一种方式
//        Criteria criteria = Criteria.where("searchText").expression("一介书生");
//        CriteriaQuery criteriaQuery = new CriteriaQuery(criteria, PageRequest.of(0, 100));
        //第二种
        MatchQueryBuilder builder = QueryBuilders.matchQuery("searchText", "一介书生");
        NativeSearchQuery searchQuery = new NativeSearchQuery(builder);
        searchQuery.setPageable(PageRequest.of(0, 10));
        SearchHits searchHits = restTemplate.search(searchQuery, LifeCircleContentES.class);

        List<LifeCircleContentES> esList = (List<LifeCircleContentES>) searchHits.get().collect(Collectors.toList());
        log.info(esList.toString());
    }

本文转载自: https://blog.csdn.net/sinat_25112709/article/details/123302515
版权归原作者 绝学 所有, 如有侵权,请联系我们删除。

“springboot集成ElasticSearch”的评论:

还没有评论