遇到的問題
- 檢索葡萄糖關鍵字,希望結果僅包含葡萄糖,不包含葡萄;檢索葡萄,希望結果包含葡萄糖。
- 同義詞如何配置
- 如何確保搜索關鍵詞被正確分詞
分析器分詞流程
分析器扮演着非常重要的角色,ES提供的有內置的分析器,社區也提供各種分析器插件(如中文的ik分析器)。分析器由以下幾個組件構成
- 字符過濾器
主要職責是在分詞器前過濾字符流,在源字符流中添加、刪除、替換字符。一個分析器中可以有0個或多個字符過濾器。主要包括:html char filter、mapping char filter等 - 分詞器
主要職責是將接收到的字符流,按照某些規則切分成若干個“詞”,並記錄這些“詞”在源字符串中的位置。分析器中有且只能有一個分詞器。 - 分詞過濾器
主要職責是將分好的“詞”進行某種規則的過濾,可以添加、移除、替換“詞”,但是不能修改“詞”在源字符串中的相對位置。常用的分詞過濾器包括:大小寫轉換過濾器、停用詞過濾器、同義詞過濾器、拼音過濾器
ik分詞器
ik分詞器介紹
優化規則:索引時,為了提供索引的覆蓋范圍,通常會采用ik_max_word分析器,會以最細粒度分詞索引,搜索時為了提高搜索准確度,會采用ik_smart分析器,會以粗粒度分詞。
mapping例子
"arttitle": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
這已經可以解決上述問題一,前提是葡萄和葡萄糖都是關鍵詞。然而在人們日常的搜索需求中,很多短語是相連的,卻並不在我們的關鍵詞中,這里我們的解決辦法是提供特殊查詢接口:短語查詢。
ik同義詞
測試分詞
直接指定分詞器
POST _analyze
{
"analyzer": "ik_max_word",
"text":"你好世界"
}
指定索引中的字段
POST weipu/_analyze
{
"field":"arttitle",
"text":"hello world"
}