中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

購物網(wǎng)站 服務(wù)器 帶寬 多大360搜索引擎地址

購物網(wǎng)站 服務(wù)器 帶寬 多大,360搜索引擎地址,中國國防新聞,商超設(shè)計目錄 一、自動補全 1.1、效果說明 1.2、安裝拼音分詞器 1.3、自定義分詞器 1.3.1、為什么要自定義分詞器 1.3.2、分詞器的構(gòu)成 1.3.3、自定義分詞器 1.3.4、面臨的問題和解決辦法 問題 解決方案 1.4、completion suggester 查詢 1.4.1、基本概念和語法 1.4.2、示例…

目錄

一、自動補全

1.1、效果說明

1.2、安裝拼音分詞器

1.3、自定義分詞器

1.3.1、為什么要自定義分詞器

1.3.2、分詞器的構(gòu)成

1.3.3、自定義分詞器

1.3.4、面臨的問題和解決辦法

問題

解決方案

1.4、completion suggester 查詢

1.4.1、基本概念和語法

1.4.2、示例

1.4.3、示例(黑馬旅游)

a)修改 hotel 索引庫結(jié)構(gòu),設(shè)置自定義拼音分詞器.

b)給 HotelDoc 類添加 suggestion 字段

c)將數(shù)據(jù)重新導(dǎo)入到 hotel 索引庫中

d)基于 JavaRestClient 編寫 DSL

1.5、黑馬旅游案例

1.5.1、需求

1.5.2、前端對接

1.5.3、實現(xiàn) controller

1.5.4、創(chuàng)建接口并實現(xiàn).

1.5.5、效果展示


一、自動補全


1.1、效果說明

當(dāng)用戶在搜索框中輸入字符時,我們應(yīng)該提示出與該字符有關(guān)的搜索項.

例如百度中,輸入關(guān)鍵詞 "byby",他的效果如下:

1.2、安裝拼音分詞器

?要實現(xiàn)根據(jù)字母補全,就需要對文檔按照拼英分詞.? 在GitHub 上有一個 es 的拼英分詞插件.

地址:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.

這里的安裝方式和 IK 分詞器一樣,分四步:

1. 安裝解壓.

2. 上傳到云服務(wù)器中,es 的 plugin 目錄.

3. 重啟 es.

4. 測試.

這里可以看到,拼音分詞器不光對每個字用拼音進行分詞,還對每個字的首字母進行分詞.

1.3、自定義分詞器

1.3.1、為什么要自定義分詞器

根據(jù)上述測試,可以看出.

1. 拼音分詞器是將一句話中的每一個字都分成了拼音,這沒什么實際的用處.

2. 這里并沒有分出漢字,只有拼英.? 實際的使用中,用戶更多的是使用漢字去搜,有拼音只是錦上添花,但是也不能只用拼音分詞器,把漢字丟了.

因此這里我們需要對拼音分詞器進行一些自定義的配置.

1.3.2、分詞器的構(gòu)成

想要自定義分詞器,首先要先了解 es 中分詞器的構(gòu)成.

分詞器主要由以下三個部分組成:

  1. character filters:在 tokenizer 之前,對文本的特殊字符進行處理. 比如他會把文本中出現(xiàn)的一些特殊字符轉(zhuǎn)化成漢字,例如?:) => 開心.
  2. tokenizer:將文本按照一定的規(guī)則切割成詞條(term). 例如 “我很開心” 會切割成 "我"、"很"、"開心".
  3. tokenizer filter:對?tokenizer 進一步處理.? 例如將漢字轉(zhuǎn)化成拼音.

1.3.3、自定義分詞器

PUT /test
{"settings": {"analysis": {"analyzer": { //自定義分詞器"my_analyzer": { //自定義分詞器名稱"tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false, "keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}}
}

  • “type”: “pinyin”:指定使用拼音過濾器進行拼音轉(zhuǎn)換。
  • “keep_full_pinyin”: false:表示不保留完整的拼音。如果設(shè)置為true,則會將完整的拼音保留下來。
  • “keep_joined_full_pinyin”: true:表示保留連接的完整拼音。當(dāng)設(shè)置為true時,如果某個詞的拼音有多個音節(jié),那么它們將被連接在一起作為一個完整的拼音。
  • “keep_original”: true:表示保留原始詞匯。當(dāng)設(shè)置為true時,原始的中文詞匯也會保留在分詞結(jié)果中。
  • “l(fā)imit_first_letter_length”: 16:限制拼音首字母的長度。默認為16,即只保留拼音首字母的前16個字符。
  • “remove_duplicated_term”: true:表示移除重復(fù)的拼音詞匯。如果設(shè)置為true,則會移除拼音結(jié)果中的重復(fù)詞匯。
  • “none_chinese_pinyin_tokenize”: false:表示是否對非中文文本進行拼音分詞處理。當(dāng)設(shè)置為false時,非中文文本將保留原樣,不進行拼音分詞處理

例如,創(chuàng)建一個 test 索引庫,來測試自定義分詞器.

PUT /test
{"settings": {"analysis": {"analyzer": { "my_analyzer": { "tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer"}}}
}

使用此索引庫的分詞器進行測試

從上圖中可以看出:

1.不光有拼音,還有中文分詞.

2.還有中文分詞后的英文全拼,以及分詞首字母.

1.3.4、面臨的問題和解決辦法

問題

上面實現(xiàn)的拼音分詞器還不能應(yīng)用到實際的生產(chǎn)環(huán)境中~

可以想象這樣一個場景:

如果詞庫中有這兩個詞:“獅子” 和 “虱子”,那么也就意味著,創(chuàng)建倒排索引時,通過上述自定義的 拼音分詞器 ,就會把這兩個詞歸為一個文檔,因為他們在分詞的時候,會分出共同的拼音 "shizi" 和 "sz",這就導(dǎo)致他兩的文檔編號對應(yīng)同一個詞條,導(dǎo)致將來用戶在搜索框里輸入 “獅子”?,點擊搜索之后,會同時搜索出 "獅子" 和 “虱子” ,這并不是我們想看到的.

解決方案

因此字段在創(chuàng)建倒排索引時因該使用 my_analyzer 分詞器,但是字段在搜索時應(yīng)該使用 ik_smart 分詞器.?

也就是說,用戶輸入中文的時候,就按中文去搜,用戶輸入拼音的時候,才按拼音去搜,即使出現(xiàn)上述情況,同時搜出這兩個詞,那你是按拼音搜,兩個都是符合的,不存在歧義.

如下:

PUT /test
{"settings": {"analysis": {"analyzer": { "my_analyzer": { "tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer" //創(chuàng)建倒排索引使用 my_analyzer 分詞器."search_analyzer":?"ik_smart"  //搜索時使用 ik_smart 分詞器.}}}
}

1.4、completion suggester 查詢

1.4.1、基本概念和語法

es 中提供了 completion suggester 查詢來實現(xiàn)自動補全功能.? 這個查詢會匹配用戶輸入內(nèi)容開頭的詞條并返回.

為了提高補全查詢的效率,對于文檔中的字段類型有一些約束,如下:

  1. 參與補全查詢的字段必須是 completion 類型.
  2. 參與 自動補全字段 的內(nèi)容一般是多個詞條形成的數(shù)組.

POST /test2/_search
{"suggest": {"title_suggest": { //自定義補全名"text": "s",  //用戶在搜索框中輸入的關(guān)鍵字"completion": { // completion 是自動補全中的一種類型(最常用的)"field": "補全時需要查詢的字段名", //這里的字段名指向的是一個數(shù)組(字段必須是 completion 類型),就是要根據(jù)數(shù)組中的字段進行查詢,然后自動補全"skip_duplicates": true,  //如果查詢時有重復(fù)的詞條,是否自動跳過(true 為跳過)"size": 10 // 獲取前 10 條結(jié)果.}}}
}

1.4.2、示例

這里我用一個示例來演示?completion suggester 的用法.

首先創(chuàng)建索引庫(參與自動補全的字段類型必須是 completion).

PUT /test2
{"mappings": {"properties": {"title": {"type": "completion"}}}
}

插入示例數(shù)據(jù)(字段內(nèi)容一般是用來補全的多個詞條形成的數(shù)組.)

POST test2/_doc
{"title": ["Sony", "WH-1000XM3"]
}
POST test2/_doc
{"title": ["SK-II", "PITERA"]
}
POST test2/_doc
{"title": ["Nintendo", "switch"]
}

這里我們設(shè)置關(guān)鍵字為 "s",來自動補全查詢,如下:

POST /test2/_search
{"suggest": {"title_suggest": {"text": "s", "completion": {"field": "title", "skip_duplicates": true, "size": 10}}}
}

1.4.3、示例(黑馬旅游)

這里我們基于之前實現(xiàn)的黑馬旅游案例來做栗子,實現(xiàn)步驟如下:

a)修改 hotel 索引庫結(jié)構(gòu),設(shè)置自定義拼音分詞器.

1.設(shè)置自定義分詞器.

2. 修改索引庫的 name、all 字段(建立倒排索引使用 拼音分詞器,搜索時使用 ik 分詞器).

3. 給索引庫添加一個新字段 suggestion,類型為 completion 類型,使用自定義分詞器.

PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_anlyzer": {"tokenizer": "ik_max_word","filter": "py"},"completion_analyzer": {"tokenizer": "keyword","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart","copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"starName":{"type": "keyword"},"business":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart"},"suggestion":{"type": "completion","analyzer": "completion_analyzer"}}}
}

b)給 HotelDoc 類添加 suggestion 字段

suggestion 字段(包含多個字段的數(shù)組,這里可以使用 List 表示),內(nèi)容包含 brand、business.

Ps:name、all 是可以分詞的,自動補全的 brand、business 是不可分詞的,要使用不同的分詞器組合.

@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;private Object distance;private Boolean isAD;private List<String> suggestion;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();this.suggestion = new ArrayList<>();suggestion.add(brand);suggestion.add(business);}
}

c)將數(shù)據(jù)重新導(dǎo)入到 hotel 索引庫中

將 hotel 索引庫刪了,然后重建(a 中的 DSL).? 通過單元測試將所有信息從數(shù)據(jù)庫同步到 es 上.

    @Testpublic void testBulkDocument() throws IOException {//1.獲取酒店所有數(shù)據(jù)List<Hotel> hotelList = hotelService.list();//2.構(gòu)造請求BulkRequest request = new BulkRequest();//3.準(zhǔn)備參數(shù)for(Hotel hotel : hotelList) {//轉(zhuǎn)化為文檔(主要是地理位置)HotelDoc hotelDoc = new HotelDoc(hotel);String json = objectMapper.writeValueAsString(hotelDoc);request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));}//4.發(fā)送請求client.bulk(request, RequestOptions.DEFAULT);}

d)基于 JavaRestClient 編寫 DSL

例如自動補全關(guān)鍵為 "h" 的內(nèi)容.

    @Testpublic void testSuggestion() throws IOException {//1.創(chuàng)建請求SearchRequest request = new SearchRequest("hotel");//2.準(zhǔn)備參數(shù)request.source().suggest(new SuggestBuilder().addSuggestion("testSuggestion",SuggestBuilders.completionSuggestion("suggestion").prefix("h").skipDuplicates(true).size(10)));//3.發(fā)送請求,接收響應(yīng)SearchResponse search = client.search(request, RequestOptions.DEFAULT);//4.解析響應(yīng)handlerResponse(search);}

這里可以對應(yīng)著 DSL 語句來寫.

對查詢結(jié)果的處理如下:

        //4.處理自動補全結(jié)果Suggest suggest = response.getSuggest();if(suggest != null) {CompletionSuggestion suggestion = suggest.getSuggestion("testSuggestion");for (CompletionSuggestion.Entry.Option option : suggestion.getOptions()) {String text = option.getText().toString();System.out.println(text);}}

這里可以對應(yīng)著 DSL 語句來寫.

運行結(jié)果如下:

1.5、黑馬旅游案例

1.5.1、需求

首先搜索框的自動補全功能.

最終實現(xiàn)效果就類似于 百度的搜索框,比如當(dāng)我們輸入 "byby",他就會立馬自動補全出有關(guān) byby 關(guān)鍵字的信息,如下圖:

1.5.2、前端對接

在搜索框中輸入,會觸發(fā)以下請求. 這里前端就傳入一個參數(shù) key.

這里約定,返回的是一個 List,內(nèi)容就是自動補全的所有信息.

1.5.3、實現(xiàn) controller

這里使用 @RequestParam 接收前端傳入的參數(shù),然后調(diào)用 IhotelService?接口處理即可.

    @RequestMapping("/suggestion")public List<String> suggestion(@RequestParam("key") String prefix) {return hotelService.suggestion(prefix);}

1.5.4、創(chuàng)建接口并實現(xiàn).

在 IhotelService 接口中創(chuàng)建 suggestion 方法.

public interface IHotelService extends IService<Hotel> {PageResult search(RequestParams params);Map<String, List<String>> filters(RequestParams params);List<String> suggestion(String prefix);
}

接著在 IhotelService 的實現(xiàn)類 HotelService 中實現(xiàn)該方法.

具體的實現(xiàn),就和前面寫的測試案例基本一致了~? 要注意的點就是補全的關(guān)鍵字不是寫死的,而是前端傳入的 prefix.

    @Overridepublic List<String> suggestion(String prefix) {try {//1.創(chuàng)建請求SearchRequest request = new SearchRequest("hotel");//2.準(zhǔn)備參數(shù)request.source().suggest(new SuggestBuilder().addSuggestion("mySuggestion",SuggestBuilders.completionSuggestion("suggestion").prefix(prefix).skipDuplicates(true).size(10)));//3.發(fā)送請求,接收響應(yīng)SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析響應(yīng)(處理自動補全結(jié)果)Suggest suggest = response.getSuggest();List<String> suggestionList = new ArrayList<>();if(suggest != null) {CompletionSuggestion suggestion = suggest.getSuggestion("mySuggestion");for (CompletionSuggestion.Entry.Option option : suggestion.getOptions()) {String text = option.getText().toString();suggestionList.add(text);}}return suggestionList;} catch (IOException e) {System.out.println("[HotelService] 自動補全失敗!prefix=" + prefix);e.printStackTrace();return null;}}
}

1.5.5、效果展示

輸入關(guān)鍵詞,即可出現(xiàn)自動補全.

http://www.risenshineclean.com/news/43858.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)怎么使用sharepoint網(wǎng)站推廣優(yōu)化外包便宜
  • 企業(yè)做的網(wǎng)站推廣方案的步驟深圳網(wǎng)站建設(shè)哪家好
  • 公司網(wǎng)站建設(shè)需要什么資質(zhì)購物網(wǎng)站頁面設(shè)計
  • 怎么選擇一家好的網(wǎng)站建設(shè)公司360優(yōu)化大師
  • 網(wǎng)站制作哪家專業(yè)微商怎么找客源人脈
  • 公司企業(yè)網(wǎng)站免費建設(shè)網(wǎng)絡(luò)營銷促銷方案
  • 做極速賽車網(wǎng)站公眾號推廣
  • 在百度網(wǎng)站備案查詢上顯示未備案是什么意思網(wǎng)頁設(shè)計素材
  • 所有政府網(wǎng)站必須做等保嗎sem運營是什么意思
  • 政務(wù)服務(wù) 網(wǎng)站 建設(shè)方案朋友圈推廣平臺
  • 網(wǎng)站收錄低的原因百度云網(wǎng)頁版登錄入口
  • 住房城鄉(xiāng)建設(shè)部辦公廳網(wǎng)站口碑營銷公司
  • 番禺區(qū)網(wǎng)站設(shè)計線上推廣的方式有哪些
  • 關(guān)于做美食的小視頻網(wǎng)站晚上免費b站軟件
  • 石家莊個人誰做網(wǎng)站廈門百度關(guān)鍵詞推廣
  • 網(wǎng)站優(yōu)化怎樣做網(wǎng)絡(luò)營銷整合推廣
  • 個人工作室可以做哪些項目win優(yōu)化大師怎么樣
  • 北京網(wǎng)站建設(shè)招聘網(wǎng)站域名查詢系統(tǒng)
  • wordpress 刪除略縮圖關(guān)鍵詞seo優(yōu)化公司
  • 做旅游銷售網(wǎng)站平臺ppt模板網(wǎng)頁設(shè)計的流程
  • 網(wǎng)站頁面小圖標(biāo)怎么做深圳優(yōu)化公司排名
  • 晾衣架 東莞網(wǎng)站建設(shè)百度一下點擊搜索
  • 關(guān)于優(yōu)化網(wǎng)站建設(shè)的方案怎么可以在百度發(fā)布信息
  • 泰州網(wǎng)站制作案例上海專業(yè)做網(wǎng)站
  • 有必要自建網(wǎng)站做導(dǎo)購嗎怎么給自己的網(wǎng)站設(shè)置關(guān)鍵詞
  • 陶瓷網(wǎng)站模板下載新浪體育最新消息
  • 怎樣推廣網(wǎng)站網(wǎng)絡(luò)廣告營銷
  • 動態(tài)網(wǎng)站開發(fā)教程seo怎么刷排名
  • 網(wǎng)站用wordpress還是wp網(wǎng)址大全瀏覽器
  • 中國建設(shè)銀行網(wǎng)站濟南網(wǎng)點品牌軟文