日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

ElasticSearch Suggest Completion 智能补全技术 整合SpringBoot+Vue实现

發(fā)布時間:2024/3/26 vue 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ElasticSearch Suggest Completion 智能补全技术 整合SpringBoot+Vue实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

效果演示視頻和教學(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中項目導(dǎo)出也是可以。本人是采取后者的做法,創(chuàng)建一個定時任務(wù),定時從MySQL中取出數(shù)據(jù)然后更新ES中的數(shù)據(jù)。

@Scheduled(cron = "*/20 * * * * ?") //20s執(zhí)行一次 // @Scheduled(cron = "0 */10 * * * ?") //10分鐘執(zhí)行一次private void configureESTasks() {logger.info("開始更新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ù)庫中查詢出數(shù)據(jù)添加到ES中for(Product product : productList){productRepository.save(product);}logger.info("更新ES中數(shù)據(jù)完成....");}

寫定時任務(wù)之前,別忘了先給對應(yīng)實體類創(chuàng)建Repository接口并且要在配置文件中進行相應(yīng)配置
Repository接口

public interface ProductRepository extends ElasticsearchRepository<Product,String> {}

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.接下來就是正戲了,寫業(yè)務(wù)邏輯層代碼!!!進行SuggestBuilder創(chuàng)建,然后獲取查詢出來的結(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個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要對用戶輸入的內(nèi)容進行監(jiān)聽,然后調(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实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。