首頁(yè)技術(shù)文章正文

如何實(shí)現(xiàn)搜索框文字自動(dòng)填充功能?

更新時(shí)間:2021-11-03 來源:黑馬程序員 瀏覽量:

我們?cè)诰W(wǎng)頁(yè)上搜索內(nèi)容時(shí),常常會(huì)看到搜索框跳出與你輸入的文字內(nèi)容相關(guān)的搜索項(xiàng),這個(gè)功能是怎么實(shí)現(xiàn)的呢?

需求說明:
當(dāng)用戶在搜索框輸入字符時(shí),我們應(yīng)該提示出與該字符有關(guān)的搜索項(xiàng),如圖:

黑馬旅游搜索框

使用拼音分詞

要實(shí)現(xiàn)根據(jù)字母做補(bǔ)全,就必須對(duì)文檔按照拼音分詞。在GitHub上恰好有elasticsearch的拼音分詞插件。地址:https://github.com/medcl/elasticsearch-analysis-pinyin

安裝方式與IK分詞器一樣,分三步:

①解壓

②上傳到虛擬機(jī)中,elasticsearch的plugin目錄

③重啟elasticsearch

④測(cè)試

自定義分詞器

elasticsearch中分詞器(analyzer)的組成包含三部分:

character filters:在tokenizer之前對(duì)文本進(jìn)行處理。例如刪除字符、替換字符。

tokenizer:將文本按照一定的規(guī)則切割成詞條(term)。例如keyword,就是不分詞;還有ik_smart。

tokenizer filter:將tokenizer輸出的詞條做進(jìn)一步處理。例如大小寫轉(zhuǎn)換、同義詞處理、拼音處理等。
假設(shè)四級(jí)考試通過的心情,通過自定義分詞器處理,大概是下面的展現(xiàn)形式:

自定義分詞器

我們可以在創(chuàng)建索引庫(kù)時(shí),通過settings來配置自定義的analyzer(分詞器),創(chuàng)建代碼如下:

PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": { // 自定義分詞器
        "my_analyzer": {  // 分詞器名稱
          "tokenizer": "ik_max_word",
          "filter": "pinyin"
        }
      }
     }
  }
}
PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": { // 自定義分詞器
        "my_analyzer": {  // 分詞器名稱
          "tokenizer": "ik_max_word",
          "filter": "py"
        }
      },
      "filter": { // 自定義tokenizer filter
        "py": { // 過濾器名稱
          "type": "pinyin", // 過濾器類型,這里是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
        }
      }
    }
  }
}

拼音分詞器適合在創(chuàng)建倒排索引的時(shí)候使用,但不能在搜索的時(shí)候使用。

創(chuàng)建倒排索引時(shí):

自定義分詞器

因此字段在創(chuàng)建倒排索引時(shí)應(yīng)該用my_analyzer分詞器;字段在搜索時(shí)應(yīng)該使用ik_smart分詞器;

PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "ik_max_word", "filter": "py"
        }
      },
      "filter": {
        "py": { ... }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_smart"
      }
    }
  }
}


completion suggester查詢
elasticsearch提供了Completion Suggester查詢來實(shí)現(xiàn)自動(dòng)補(bǔ)全功能。這個(gè)查詢會(huì)匹配以用戶輸入內(nèi)容開頭的詞條并返回。為了提高補(bǔ)全查詢的效率,對(duì)于文檔中字段的類型有一些約束:

參與補(bǔ)全查詢的字段必須是completion類型。

字段的內(nèi)容一般是用來補(bǔ)全的多個(gè)詞條形成的數(shù)組。completion suggester查詢

// 創(chuàng)建索引庫(kù)
PUT test
{
  "mappings": {
    "properties": {
      "title":{
        "type": "completion"
      }
    }
  }
}
// 示例數(shù)據(jù)
POST test/_doc
{
  "title": ["Sony", "WH-1000XM3"]
}
POST test/_doc
{
  "title": ["SK-II", "PITERA"]
}
POST test/_doc
{
  "title": ["Nintendo", "switch"]
}


completion suggester查詢
查詢語(yǔ)法如下:

// 自動(dòng)補(bǔ)全查詢
GET /test/_search
{
  "suggest": {
    "title_suggest": {
      "text": "s", // 關(guān)鍵字
      "completion": {
        "field": "title", // 補(bǔ)全查詢的字段
        "skip_duplicates": true, // 跳過重復(fù)的
        "size": 10 // 獲取前10條結(jié)果
      }
    }
  }
}

注意:自動(dòng)補(bǔ)全對(duì)字段的要求類型是completion類型,字段值是多詞條的數(shù)組。

 案例:實(shí)現(xiàn)hotel索引庫(kù)的自動(dòng)補(bǔ)全、拼音搜索功能

實(shí)現(xiàn)思路如下:

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

2.修改索引庫(kù)的name、all字段,使用自定義分詞器

3.索引庫(kù)添加一個(gè)新字段suggestion,類型為completion類型,使用自定義的分詞器

4.給HotelDoc類添加suggestion字段,內(nèi)容包含brand、business

5.重新導(dǎo)入數(shù)據(jù)到hotel庫(kù)

注意:name、all是可分詞的,自動(dòng)補(bǔ)全的brand、business是不可分詞的,要使用不同的分詞器組合

RestAPI實(shí)現(xiàn)自動(dòng)補(bǔ)全

先看請(qǐng)求參數(shù)構(gòu)造的API:

自動(dòng)補(bǔ)全

再來看解析:


 案例2:實(shí)現(xiàn)酒店搜索頁(yè)面輸入框的自動(dòng)補(bǔ)全

查看前端頁(yè)面,可以發(fā)現(xiàn)當(dāng)我們?cè)谳斎肟蜴I入時(shí),前端會(huì)發(fā)起ajax請(qǐng)求:

自動(dòng)補(bǔ)全

在服務(wù)端編寫接口,接收該請(qǐng)求,返回補(bǔ)全結(jié)果的集合,類型為L(zhǎng)ist




,在服務(wù)端編寫接口,接收該請(qǐng)求,返回補(bǔ)全結(jié)果的集合,類型為L(zhǎng)ist

猜你喜歡:

ELK高級(jí)搜索教程【java中級(jí)課程】

ADSL是什么?看完你就懂了

fileitem類的常用方法有哪些?

黑馬史上最全SpringBoot從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)教程

黑馬程序員java開發(fā)培訓(xùn)

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!