ElasticSearch - 自定義 analysis

古古

2018/06/09


  • ElasticSearch 的 analysis 實際上是將三個功能封裝在一起,這三個功能按照順序執行,而這三個功能都是能自定義的
    • 字符過濾器 (char_filter)
      • 首先,字符串按順序通過每個字符過濾器,他們的任務是在分詞前整理字符串
      • 一個字符過濾器可以用來去掉HTML,或者將&轉化成and
    • 分詞器 (tokenizer)
      • 其次,字符串被分詞器分爲單個的詞條,一個簡單的分詞器遇到空格和標點的時候,可能會將文本拆分成詞條
      • Hello how are you?會被ES預設的分詞器standard分成hellohowareyou
    • Token 過濾器 (filter)
      • 最後,詞條按順序通過每個 token 過濾器,這個過程可能會改變詞條(Quick -> quick)、刪除詞條(a、an、and、the…)、增加詞條(jump和leap這種同義詞)
  • 自定義 analysis
    • 格式
      PUT mytest
      {
          "setting": {
              "analysis": {
                  "char_filter": { 自定義的字符過濾器 },
                  "tokenizer": { 自定義的分詞器 },
                  "filter": { 自定義的token過濾器 },
                  "analyzer": { 自定義的分析器,可以將上面的char_filter、tokenizer、filter用不同的組合拼起來,形成不同的分析器 }
              }
          }
      }
      
    • 具體實例
      PUT mytest
      {
          "settings": {
              "analysis": {
                  "char_filter": {
                      "&_to_and": {
                          "type": "mapping",
                          "mappings": ["&=> and "]
                      },
                      "xxx": {....},
                      "yyy": {....}
                  },
                  "filter": {
                      "my_stopwords": {
                          "type": "stop",
                          "stopwords": ["the", "a"]
                      }
                  },
                  "analyzer": {
                      //自定義分析器,將想要的char_filter、tokenizer、filter給加載進來
                      //數組順序很重要,因為是照順序執行,先執行htmp_strip,再執行&_to_and,然後才去執行tokenizer
                      "my_analyzer": {
                          "type": "custom",
                          "char_filter": ["htmp_strip", "&_to_and"],
                          "tokenizer": "standard",
                          "filter": ["lowercase", "my_stopwords"]
                      }
                  }
              }
          },
          "mappings": {
              "doc": {
                  "properties": {
                      "nickname": { 
                          "type": "text",
                          "analyzer": "my_analyzer" //使用自定義的分析器
                      }
                  }
              }
          }
      }
      
  • 控制分析器 search_analyzer、analyzer
    • 分析器主要有兩種情況會被使用,一種是插入文檔時,將text類型的字段做分詞然後插入倒排索引,第二種就是在查詢時,先對要查詢的text類型的輸入做分詞,再去倒排索引搜索

    • 如果想要讓 索引 和 查詢 時使用不同的分詞器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer參數

      • 在索引時,只會去看字段有沒有定義analyzer,有定義的話就用定義的,沒定義就用ES預設的
      • 在查詢時,會先去看字段有沒有定義search_analyzer,如果沒有定義,就去看有沒有analyzer,再沒有定義,才會去使用ES預設的
    • 具體實例

      PUT mytest
      {
          "mappings": {
              "doc": {
                  "properties": {
                      "nickname": { 
                          "type": "text",
                          "analyzer": "standard",  //索引時使用standard分詞器
                          "search_analyzer": "simple" //查詢時使用simple分詞器
                      },
                      "name": {
                      	"type": "text",
                          "analyzer": "standard" //索引和查詢都使用standard分詞器
                      }
                  }
              }
          }
      }