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());
}
|