elasticsearch中文搜索優化


遇到的問題

  1. 檢索葡萄糖關鍵字,希望結果僅包含葡萄糖,不包含葡萄;檢索葡萄,希望結果包含葡萄糖。
  2. 同義詞如何配置
  3. 如何確保搜索關鍵詞被正確分詞

分析器分詞流程

分析器扮演着非常重要的角色,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同義詞

ik同義詞配置

測試分詞

直接指定分詞器

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":"你好世界"
}

指定索引中的字段

POST weipu/_analyze
{
  "field":"arttitle",
  "text":"hello world"
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM