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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

vue

springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索

發(fā)布時(shí)間:2024/9/27 vue 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


背景:實(shí)現(xiàn)和百度搜索一樣效果的,全文搜索引擎支持關(guān)鍵詞高亮顯示

文章目錄

          • 1. 企業(yè)級(jí)搜索引擎解決方案
          • 2. 創(chuàng)建索引規(guī)則
          • 3. 數(shù)據(jù)拉取
          • 4. 搜索高亮
          • 5. 自定義詞庫(kù)
          • 6. 效果圖
          • 7. 開(kāi)源源碼

1. 企業(yè)級(jí)搜索引擎解決方案

分詞器:english、standard、ik_max_smart、ik_smart、whitespace等

  • 索引:創(chuàng)建索引時(shí)用ik_max_smart進(jìn)行分詞,搜索時(shí)使用ik_smart分詞器進(jìn)行搜索
  • 查詢:精準(zhǔn)匹配使用term;查詢匹配使用match
  • 類型:需要分詞使用text,部分詞精準(zhǔn)用keyword,分?jǐn)?shù)用double,經(jīng)緯度用geo_point,數(shù)字用integer
  • 2. 創(chuàng)建索引規(guī)則
    PUT /jd_goods {"settings" : {"number_of_shards" : 1,"number_of_replicas" : 1},"mappings": {"properties": {"id":{"type": "integer"},"title":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"desc":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"price":{"type": "text"},"img":{"type": "text"}}} }
    3. 數(shù)據(jù)拉取

    http://localhost:9090/parse/vue

    public List<Content> parseJD(String keyword) throws IOException {String baseUrl = "https://search.xxx.com/Search?keyword=";// 解析網(wǎng)頁(yè) 在線預(yù)覽中有處理Document document = Jsoup.parse(new URL(baseUrl + keyword), 30000);// 所有js中可以使用的方法,這里都能用Element element = document.getElementById("J_goodsList");//獲取搜有的li元素Elements elements = element.getElementsByTag("li");ArrayList<Content> goodList = new ArrayList<>();// 獲取元素中的內(nèi)容,這里el 就是每一個(gè)li標(biāo)簽了for (Element el : elements) {//關(guān)于這種圖片特別多的網(wǎng)站,所有的圖片都是拉加載的String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");String price = el.getElementsByClass("p-price").eq(0).text();String title = el.getElementsByClass("p-name").eq(0).text();Content content = new Content();content.setTitle(title);content.setImg(img);content.setPrice("內(nèi)容標(biāo)題 " + price);content.setDesc("內(nèi)容描述 " + title);goodList.add(content);}return goodList;}

    4. 搜索高亮
    // 2. 獲取es中的數(shù)據(jù),實(shí)現(xiàn)基本搜索高亮功能public List<Map<String, Object>> searchPageHighlight(String keyword, int pageNo, int pageSize) throws IOException {if (pageNo <= 1) {pageNo = 1;}// 條件搜索SearchRequest searchRequest = new SearchRequest(ESConst.JD_SEARCH_INDEX);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 分頁(yè)searchSourceBuilder.from(pageNo);searchSourceBuilder.size(pageSize);// 精準(zhǔn)匹配TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(ESConst.SEARCH_CONDITION_FIELD, keyword);searchSourceBuilder.query(termQueryBuilder);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));//構(gòu)建高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field(ESConst.HIGHLIGHT_TITLE);highlightBuilder.field("desc");highlightBuilder.requireFieldMatch(true);//多個(gè)高亮 顯示highlightBuilder.preTags(ESConst.HIGHLIGHT_PRE_TAGS);highlightBuilder.postTags(ESConst.HIGHLIGHT_POST_TAGS);searchSourceBuilder.highlighter(highlightBuilder);// 執(zhí)行搜索searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 解析結(jié)果ArrayList<Map<String, Object>> list = new ArrayList<>();for (SearchHit hit : searchResponse.getHits().getHits()) {// 解析高亮的字段,將原來(lái)的字段置換為我們高亮的字段即可!Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField title = highlightFields.get(ESConst.HIGHLIGHT_TITLE);HighlightField desc = highlightFields.get("desc");// 獲取原來(lái)的結(jié)果Map<String, Object> sourceAsMap = hit.getSourceAsMap();if (title != null) {Text[] fragments = title.fragments();String newTitle = "";for (Text text : fragments) {newTitle += text;}//高亮字段替換掉原來(lái)的內(nèi)容即可sourceAsMap.put(ESConst.SEARCH_CONDITION_FIELD, newTitle);}if (desc != null) {Text[] fragments = desc.fragments();String newDesc = "";for (Text text : fragments) {newDesc += text;}//高亮字段替換掉原來(lái)的內(nèi)容即可sourceAsMap.put("desc", newDesc);}// 將結(jié)果放入list容器返回list.add(sourceAsMap);}return list;}
    5. 自定義詞庫(kù)

    new_word.dic

    女包 女士包 java語(yǔ)言

    6. 效果圖

    http://localhost:9090/


    7. 開(kāi)源源碼

    https://gitee.com/gblfy/es7-jd-vue

    總結(jié)

    以上是生活随笔為你收集整理的springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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