Spring Boot 整合 Elasticsearch救恨,實(shí)現(xiàn) function score query 權(quán)重分查詢

摘要: 原創(chuàng)出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉(zhuǎn)載强窖,保留摘要,謝謝游沿!

『 預(yù)見(jiàn)未來(lái)最好的方式就是親手創(chuàng)造未來(lái) - 《史蒂夫·喬布斯傳》 』

運(yùn)行環(huán)境:JDK 7 或 8饰抒,Maven 3.0+技術(shù)棧:SpringBoot 1.5+,ElasticSearch 2.3.2本文提綱一诀黍、ES 的使用場(chǎng)景二袋坑、運(yùn)行 springboot-elasticsearch 工程三、springboot-elasticsearch 工程代碼詳解

一眯勾、ES 的使用場(chǎng)景

簡(jiǎn)單說(shuō)枣宫,ElasticSearch(簡(jiǎn)稱 ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎吃环。在《Elasticsearch 和插件 elasticsearch-head 安裝詳解》 ?和 《Elasticsearch 默認(rèn)配置 IK 及 Java AnalyzeRequestBuilder 使用》 我詳細(xì)的介紹了如何安裝也颤,初步使用了 IK 分詞器。這里郁轻,我主要講下 SpringBoot 工程中如何使用 ElasticSearch翅娶。ES 的使用場(chǎng)景大致分為兩塊1. 全文檢索。加上分詞(IK 是其中一個(gè))、拼音插件等可以成為強(qiáng)大的全文搜索引擎竭沫。2. 日志統(tǒng)計(jì)分析厂庇。可以實(shí)時(shí)動(dòng)態(tài)分析海量日志數(shù)據(jù)输吏。

二权旷、運(yùn)行 springboot-elasticsearch 工程

注意的是這里使用的是 ElasticSearch 2.3.2。是因?yàn)?a target="_blank" rel="nofollow">版本對(duì)應(yīng)關(guān)系:

Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)

x <= 1.3.5 y <= 1.3.4 z <= 1.7.2* x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0**

* - 只需要你修改下對(duì)應(yīng)的 pom 文件版本號(hào)

** - 下一個(gè) ES 的版本會(huì)有重大的更新

git clone 下載工程 springboot-elasticsearch 贯溅,項(xiàng)目地址見(jiàn) GitHub - https://github.com/JeffLi1993/springboot-learning-example拄氯。1. 后臺(tái)起守護(hù)線程啟動(dòng) Elasticsearch

cd elasticsearch-2.3.2/

./bin/elasticsearch -d

下面開(kāi)始運(yùn)行工程步驟(Quick Start):2. 項(xiàng)目結(jié)構(gòu)介紹

org.spring.springboot.controller - Controller 層

org.spring.springboot.repository - ES 數(shù)據(jù)操作層

org.spring.springboot.domain - 實(shí)體類

org.spring.springboot.service - ES 業(yè)務(wù)邏輯層

Application - 應(yīng)用啟動(dòng)類

application.properties - 應(yīng)用配置文件,應(yīng)用啟動(dòng)會(huì)自動(dòng)讀取配置

本地啟動(dòng)的 ES 它浅,就不需要改配置文件了译柏。如果連測(cè)試 ES 服務(wù)地址,需要修改相應(yīng)配置3.編譯工程在項(xiàng)目根目錄 springboot-elasticsearch姐霍,運(yùn)行 maven 指令:

mvn clean install

4.運(yùn)行工程右鍵運(yùn)行 Application 應(yīng)用啟動(dòng)類(位置:/springboot-learning-example/springboot-elasticsearch/src/main/java/org/spring/springboot/Application.java)的 main 函數(shù)鄙麦,這樣就成功啟動(dòng)了 springboot-elasticsearch 案例。用 Postman 工具新增兩個(gè)城市新增城市信息

POST http://127.0.0.1:8080/api/city

{

"id":"1",

"provinceid":"1",

"cityname":"溫嶺",

"description":"溫嶺是個(gè)好城市"

}

POST http://127.0.0.1:8080/api/city

{

"id":"2",

"provinceid":"2",

"cityname":"溫州",

"description":"溫州是個(gè)熱城市"

}

可以打開(kāi) ES 可視化工具 head 插件:http://localhost:9200/_plugin/head/:(如果不知道怎么安裝镊折,請(qǐng)查閱 《Elasticsearch 和插件 elasticsearch-head 安裝詳解》 胯府。)在「數(shù)據(jù)瀏覽」tab,可以查閱到 ES 中數(shù)據(jù)是否被插入恨胚,插入后的數(shù)據(jù)格式如下:

{

"_index": "cityindex",

"_type": "city",

"_id": "1",

"_version": 1,

"_score": 1,

"_source": {

"id": 1,

"provinceid": 1,

"cityname": "溫嶺",

"description": "溫嶺是個(gè)好城市"

}

}

下面驗(yàn)證下權(quán)重分查詢搜索接口的實(shí)現(xiàn):GET http://localhost:8080/api/city/search?pageNumber=0&pageSize=10&searchContent=溫嶺數(shù)據(jù)是會(huì)出現(xiàn)

[

{

"id": 1,

"provinceid": 1,

"cityname": "溫嶺",

"description": "溫嶺是個(gè)好城市"

},

{

"id": 2,

"provinceid": 2,

"cityname": "溫州",

"description": "溫州是個(gè)熱城市"

}

]

從啟動(dòng)后臺(tái) Console 可以看出骂因,打印出來(lái)對(duì)應(yīng)的 DSL 語(yǔ)句:

{

"function_score" : {

"functions" : [ {

"filter" : {

"bool" : {

"should" : {

"match" : {

"cityname" : {

"query" : "溫嶺",

"type" : "boolean"

}

}

}

}

},

"weight" : 1000.0

}, {

"filter" : {

"bool" : {

"should" : {

"match" : {

"description" : {

"query" : "溫嶺",

"type" : "boolean"

}

}

}

}

},

"weight" : 100.0

} ]

}

}

為什么會(huì)出現(xiàn) 溫州 城市呢?因?yàn)?function score query 權(quán)重分查詢赃泡,無(wú)相關(guān)的數(shù)據(jù)默認(rèn)分值為 1寒波。如果想除去,設(shè)置一個(gè) setMinScore 分值即可升熊。


三俄烁、springboot-elasticsearch 工程代碼詳解

具體代碼見(jiàn)GitHub-https://github.com/JeffLi1993/springboot-learning-example


1.pom.xml 依賴

這里依賴的 spring-boot-starter-data-elasticsearch 版本是 1.5.1.RELEASE,對(duì)應(yīng)的 spring-data-elasticsearch 版本是 2.1.0.RELEASE级野。后面數(shù)據(jù)操作層都是通過(guò)該 spring-data-elasticsearch 提供的接口實(shí)現(xiàn)页屠。操作對(duì)應(yīng)官方文檔:http://docs.spring.io/spring-data/elasticsearch/docs/2.1.0.RELEASE/reference/html/。


2. application.properties 配置 ES 地址

# ES

spring.data.elasticsearch.repositories.enabled = true

spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

默認(rèn) 9300 是 Java 客戶端的端口勺阐。9200 是支持 Restful HTTP 的接口卷中。更多配置:

spring.data.elasticsearch.cluster-name Elasticsearch 集群名。(默認(rèn)值: elasticsearch)

spring.data.elasticsearch.cluster-nodes 集群節(jié)點(diǎn)地址列表渊抽,用逗號(hào)分隔蟆豫。如果沒(méi)有指定,就啟動(dòng)一個(gè)客戶端節(jié)點(diǎn)懒闷。

spring.data.elasticsearch.propertie 用來(lái)配置客戶端的額外屬性十减。

spring.data.elasticsearch.repositories.enabled 開(kāi)啟 Elasticsearch 倉(cāng)庫(kù)栈幸。(默認(rèn)值:true。)


3. ES 數(shù)據(jù)操作層

@Repository

public interface CityRepository extends ElasticsearchRepository {

}

接口只要繼承 ElasticsearchRepository 類即可帮辟。默認(rèn)會(huì)提供很多實(shí)現(xiàn)速址,比如 CRUD 和搜索相關(guān)的實(shí)現(xiàn)。


4. 實(shí)體類

@Document(indexName = "cityindex", type = "city")

public class City implements Serializable{

private static final long serialVersionUID = -1L;

/**

* 城市編號(hào)

*/

private Long id;

/**

* 省份編號(hào)

*/

private Long provinceid;

/**

* 城市名稱

*/

private String cityname;

/**

* 描述

*/

private String description;

}

注意index 配置必須是全部小寫(xiě)由驹,不然會(huì)暴異常芍锚。org.elasticsearch.indices.InvalidIndexNameException: Invalid index name [cityIndex], must be lowercase


5. ES 業(yè)務(wù)邏輯層

/**

* 城市 ES 業(yè)務(wù)邏輯實(shí)現(xiàn)類

*

* Created by bysocket on 07/02/2017.

*/

@Service

public class CityESServiceImpl implements CityService {

private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);

@Autowired

CityRepository cityRepository;

@Override

public Long saveCity(City city) {

City cityResult = cityRepository.save(city);

return cityResult.getId();

}

@Override

public List searchCity(Integer pageNumber,

Integer pageSize,

String searchContent) {

// 分頁(yè)參數(shù)

Pageable pageable = new PageRequest(pageNumber, pageSize);

// Function Score Query

FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()

.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("cityname", searchContent)),

ScoreFunctionBuilders.weightFactorFunction(1000))

.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),

ScoreFunctionBuilders.weightFactorFunction(100));

// 創(chuàng)建搜索 DSL 查詢

SearchQuery searchQuery = new NativeSearchQueryBuilder()

.withPageable(pageable)

.withQuery(functionScoreQueryBuilder).build();

LOGGER.info("\n searchCity(): searchContent [" + searchContent + "] \n DSL? = \n " + searchQuery.getQuery().toString());

Page searchPageResults = cityRepository.search(searchQuery);

return searchPageResults.getContent();

}

}

保存邏輯很簡(jiǎn)單。分頁(yè) function score query 搜索邏輯如下:先創(chuàng)建分頁(yè)參數(shù)蔓榄,然后用 FunctionScoreQueryBuilder 定義 Function Score Query并炮,并設(shè)置對(duì)應(yīng)字段的權(quán)重分值。城市名稱 1000 分甥郑,description 100 分逃魄。然后創(chuàng)建該搜索的 DSL 查詢,并打印出來(lái)澜搅。

四伍俘、小結(jié)

實(shí)際場(chǎng)景還會(huì)很復(fù)雜。這里只是點(diǎn)睛之筆勉躺,后續(xù)大家優(yōu)化或者更改下 DSL 語(yǔ)句就可以完成自己想要的搜索規(guī)則癌瘾。


推薦:《Spring Boot 整合 Dubbo/ZooKeeper 詳解 SOA 案例》上一篇:《Spring Boot 整合 Mybatis Annotation 注解案例

歡迎掃一掃我的公眾號(hào)關(guān)注 — 及時(shí)得到博客訂閱哦!

http://www.bysocket.com/

https://github.com/JeffLi1993

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赂蕴,一起剝皮案震驚了整個(gè)濱河市柳弄,隨后出現(xiàn)的幾起案子舶胀,更是在濱河造成了極大的恐慌概说,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣伐,死亡現(xiàn)場(chǎng)離奇詭異糖赔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轩端,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)放典,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人基茵,你說(shuō)我怎么就攤上這事奋构。” “怎么了拱层?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵弥臼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我根灯,道長(zhǎng)径缅,這世上最難降的妖魔是什么掺栅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纳猪,結(jié)果婚禮上氧卧,老公的妹妹穿的比我還像新娘。我一直安慰自己氏堤,他們只是感情好沙绝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鼠锈,像睡著了一般宿饱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脚祟,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天谬以,我揣著相機(jī)與錄音,去河邊找鬼由桌。 笑死为黎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的行您。 我是一名探鬼主播铭乾,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娃循!你這毒婦竟也來(lái)了炕檩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捌斧,失蹤者是張志新(化名)和其女友劉穎笛质,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捞蚂,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妇押,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姓迅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲霍。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丁存,靈堂內(nèi)的尸體忽然破棺而出肩杈,到底是詐尸還是另有隱情,我是刑警寧澤解寝,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布扩然,位于F島的核電站,受9級(jí)特大地震影響编丘,放射性物質(zhì)發(fā)生泄漏与学。R本人自食惡果不足惜彤悔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望索守。 院中可真熱鬧晕窑,春花似錦、人聲如沸卵佛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)截汪。三九已至疾牲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衙解,已是汗流浹背阳柔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓峦,地道東北人舌剂。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暑椰,于是被迫代替她去往敵國(guó)和親霍转。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 『 風(fēng)云說(shuō):能分享自己職位的知識(shí)的領(lǐng)導(dǎo)是個(gè)好領(lǐng)導(dǎo)一汽。 』 運(yùn)行環(huán)境:JDK 7 或 8避消,Maven 3.0+ 技術(shù)棧...
    子木聊出海閱讀 2,809評(píng)論 0 51
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)召夹,斷路器岩喷,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 愛(ài)你的人和你愛(ài)的人均驶,你最后會(huì)選擇誰(shuí)?人生只有一世枫虏,你就是他(她)生命中的最愛(ài),而你卻鐘情于她(他)爬虱,于是這...
    沫小美閱讀 370評(píng)論 0 1
  • 最近看了一部名為《我親愛(ài)的朋友們》的韓劇隶债,里面講述了一群老人的故事。人就像一壇酒跑筝,愈老彌香死讹,等待著后人去發(fā)現(xiàn)他的醇...
    呀巴拉拉閱讀 246評(píng)論 0 0