ElasticSearch Suggest Completion 智能补全技术 整合SpringBoot+Vue实现
生活随笔
收集整理的這篇文章主要介紹了
ElasticSearch Suggest Completion 智能补全技术 整合SpringBoot+Vue实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
效果演示視頻和教學(xué)講解視頻地址:演示地址
1.首先在Kibana中創(chuàng)建索引和類型。
PUT /campus_market {"mappings": {"product" : {"properties" : {"name" : {"type": "text","analyzer": "ik_max_word","fields": {"suggest" : {"type" : "completion","analyzer": "ik_max_word"}}},"info": {"type": "text","analyzer": "ik_max_word"}}}} }2.然后在Kibana中導(dǎo)入文檔數(shù)據(jù),或者在SpringBoot中項(xiàng)目導(dǎo)出也是可以。本人是采取后者的做法,創(chuàng)建一個(gè)定時(shí)任務(wù),定時(shí)從MySQL中取出數(shù)據(jù)然后更新ES中的數(shù)據(jù)。
@Scheduled(cron = "*/20 * * * * ?") //20s執(zhí)行一次 // @Scheduled(cron = "0 */10 * * * ?") //10分鐘執(zhí)行一次private void configureESTasks() {logger.info("開(kāi)始更新ES中數(shù)據(jù)....");ResponseDTO<List<ProductDTO>> productDTOList = productService.getProductList(new ProductDTO());List<Product> productList = CopyUtil.copyList(productDTOList.getData(), Product.class);List<Product> allProductList = productMapper.selectByExample(new ProductExample());//先清空ElasticSearch中的數(shù)據(jù)for(Product product : allProductList) {productRepository.delete(product);}//從數(shù)據(jù)庫(kù)中查詢出數(shù)據(jù)添加到ES中for(Product product : productList){productRepository.save(product);}logger.info("更新ES中數(shù)據(jù)完成....");}寫定時(shí)任務(wù)之前,別忘了先給對(duì)應(yīng)實(shí)體類創(chuàng)建Repository接口并且要在配置文件中進(jìn)行相應(yīng)配置。
Repository接口
config配置文件配置
@Configuration public class ESRestClientConfig extends AbstractElasticsearchConfiguration {@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("127.0.0.1:9200").build();return RestClients.create(clientConfiguration).rest();} }3.接下來(lái)就是正戲了,寫業(yè)務(wù)邏輯層代碼!!!進(jìn)行SuggestBuilder創(chuàng)建,然后獲取查詢出來(lái)的結(jié)果(代碼中的keyword就是查詢匹配的結(jié)果內(nèi)容),返回給前端。
@Qualifier("elasticsearchClient")@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 智能匹配搜索* @param productDTO* @return*/@Overridepublic ResponseDTO<List<String>> suggestCompletionProduct(ProductDTO productDTO) {List<String> resultList = new ArrayList<>();CompletionSuggestionBuilder suggestion = SuggestBuilders.completionSuggestion("name.suggest").prefix(productDTO.getName()).skipDuplicates(true);SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("product", suggestion);SearchRequest searchRequest = new SearchRequest();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.suggest(suggestBuilder);searchRequest.indices("campus_market").types("product").source(searchSourceBuilder);try {SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);Suggest suggest = response.getSuggest();//SearchResponse response = elasticsearchRestTemplate.suggest(suggestBuilder, Product.class);int maxSuggestNum = 0; // 最多5個(gè)if (suggest != null) {List<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> entries= suggest.getSuggestion("product").getEntries();for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> entry : entries) {for (Suggest.Suggestion.Entry.Option option : entry.getOptions()) {String keyword = option.getText().string();if (maxSuggestNum < 5) {resultList.add(keyword);maxSuggestNum++;} else {break;}}}}} catch (IOException e) {e.printStackTrace();return ResponseDTO.errorByMsg(CodeMsg.SYSTEM_ERROR);}return ResponseDTO.success(resultList);}4.前端Vue要對(duì)用戶輸入的內(nèi)容進(jìn)行監(jiān)聽(tīng),然后調(diào)用接口獲取數(shù)據(jù)。
<div class="search-input"><el-input v-model="searchName" placeholder="搜一搜好貨" @input="changeInput" clearable><el-select v-model="searchCategoryId" slot="prepend"><el-option label="全部類目" value="0"></el-option><el-option v-for="(item, index) in categoryList" :key="index" :label="item.name" :value="item.id"></el-option></el-select></el-input><div class="suggest-content"><div class="suggest-content-item" @click="toProductDetail(item.id)" v-for="(item, index) in suggestList" :key="index">{{item.name}}</div></div> </div> changeInput(e) {let _this = this;// 函數(shù)節(jié)流,防止數(shù)據(jù)頻繁更新,每300毫秒才搜索一次if (!this.timer) {this.timer = setTimeout(function(){_this.getSuggestList(e);_this.timer = null;},300)}},getSuggestList(e) {let _this = this;this.$ajax.post(process.env.VUE_APP_SERVER + "/product/suggest", {name: e}).then((response)=>{let resp = response.data;let resultList = [];if(resp.code === 0){let data = resp.data;_this.productList.forEach(item => {data.forEach(name => {if(item.name === name) {let val = {id: item.id,name: item.name};resultList.push(val);}})});}_this.suggestList = resultList;});} .suggest-content {position: absolute;background: #fff;width: 480px;margin-left: 110px;border: 1px solid #444444;z-index: 1;height: auto;max-height: 300px;overflow-y: auto;display: block;}.suggest-content-item {width: 98%;margin: 5px 5px;cursor: pointer;}.search-input .el-select {width: 110px;}.search-input {width: 590px;}總結(jié)
以上是生活随笔為你收集整理的ElasticSearch Suggest Completion 智能补全技术 整合SpringBoot+Vue实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows XP 自动开机
- 下一篇: 案例2-1商品入库