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));
		//第二种 
		MatchPhraseQueryBuilder builder = QueryBuilders.matchPhraseQuery("searchText", "上下天光");
		NativeSearchQuery searchQuery = new NativeSearchQuery(builder);
		SearchHits searchHits = restTemplate.search(searchQuery, LifeCircleContentES.class);


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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值