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://www.uj5u.com/qita/438084.html
標籤:其他
上一篇:五-上, Spark RDD 概述,五大屬性,執行原理
下一篇:TiDB基本原理學習
