ES搜索補(bǔ)全建議一

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


image.png

elasticsearch提供了Completion Suggesttion查詢實(shí)現(xiàn)自動補(bǔ)全浅乔。為了提高補(bǔ)全查詢的效率鲤妥,對于文檔字段的類型有限制

  • 參與補(bǔ)全查詢的字段必須是completetion類型
  • 字段的內(nèi)容一般是用來補(bǔ)全的多個字條組成的數(shù)組
PUT test
{
"mappings": {
"  properties": {
  "title":{
  "type": "completion"
      }
    }
  }
}

插入下面數(shù)據(jù)

// 示例數(shù)據(jù)
POST test/_doc
{
"title": ["Sony", "WH-1000XM3"]
}
POST test/_doc
{
"title": ["SK-II", "PITERA"]
}
POST test/_doc
{
"title": ["Nintendo", "switch"]
}

查詢的DSL語句如下

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

實(shí)現(xiàn)酒店搜索框的自動補(bǔ)全

1修改hotel索引的索引庫結(jié)構(gòu),設(shè)置自定義拼音分詞器
2修改索引庫需要被自定義分詞字段那么/all
3索引庫添加一個新字段suggestion夷恍,類型為completetion類型魔眨,使用我們自己自定義分詞器
4給HotelDoc類添加suggestestion字段,內(nèi)容包含brand酿雪、business
5重新導(dǎo)入數(shù)據(jù)到hotel庫

酒店索引映射結(jié)構(gòu)
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"
      }
    }
  }
}

JAVA類

@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();

        // 判斷商圈是否包含/
        if (this.business.contains("/")) {
            // 需要切割
            String[] arr = this.business.split("/");
            this.suggestion = new ArrayList<>();
            this.suggestion.add(this.brand);
            Collections.addAll(this.suggestion, arr);
        } else {
            this.suggestion = Arrays.asList(this.brand, this.business);
        }

    }
}

重新導(dǎo)入數(shù)據(jù),編寫DSL語句


image.png
測試補(bǔ)全
參考圖片
解析語句

參考
elasticsearch系列五:搜索詳解(查詢建議介紹遏暴、Suggester 介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市指黎,隨后出現(xiàn)的幾起案子朋凉,更是在濱河造成了極大的恐慌,老刑警劉巖醋安,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杂彭,死亡現(xiàn)場離奇詭異,居然都是意外死亡吓揪,警方通過查閱死者的電腦和手機(jī)亲怠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠辞,“玉大人团秽,你說我怎么就攤上這事。” “怎么了习勤?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵踪栋,是天一觀的道長。 經(jīng)常有香客問我图毕,道長夷都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任予颤,我火速辦了婚禮囤官,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荣瑟。我一直安慰自己治拿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布笆焰。 她就那樣靜靜地躺著劫谅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚷掠。 梳的紋絲不亂的頭發(fā)上捏检,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音不皆,去河邊找鬼贯城。 笑死,一個胖子當(dāng)著我的面吹牛霹娄,可吹牛的內(nèi)容都是我干的能犯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼犬耻,長吁一口氣:“原來是場噩夢啊……” “哼踩晶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枕磁,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤渡蜻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后计济,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茸苇,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年沦寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了学密。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凑队,死狀恐怖则果,靈堂內(nèi)的尸體忽然破棺而出幔翰,到底是詐尸還是另有隱情漩氨,我是刑警寧澤西壮,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站叫惊,受9級特大地震影響款青,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霍狰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一抡草、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔗坯,春花似錦康震、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绘梦,卻和暖如春橘忱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卸奉。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工钝诚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄棵。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓凝颇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疹鳄。 傳聞我的和親對象是個殘疾皇子拧略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容