1. 程式人生 > >小白學ES 09 - ES如何利用分析器分析索引 + 如何定製分析器

小白學ES 09 - ES如何利用分析器分析索引 + 如何定製分析器

文章目錄

1 索引分析

索引分析: 將文字塊按照一定的策略分解, 並建立倒排索引的過程. 這個過程由分析器(analyzers)完成.

1.1 分析器的組成

① 字元過濾器(character filter): 去除HTML標籤, 或轉換"&"為"and"等.

② 分詞器(tokenizer): 按照某種規律, 如根據空格、逗號等, 將文字塊進行分解.

③ 標記過濾器(token filter): 所有被分詞器分解的詞都將經過token filters的處理, 它可以修改詞(如小寫化處理)、去掉詞(根據某一規則去掉無意義的詞, 如"a", “the”, “的"等), 增加詞(如同義詞"jump”、"leap"等).

注意: 人們一般將分析器通稱為分詞器, 並不是相等的關係, 而是包含的關係.

1.2 倒排索引核心原理-normalization

建立倒排索引時, 會執行 normalization(正常化)操作 —— 將拆分的各個單詞進行相應的處理, 以提高搜尋時命中相關聯的文件的概率.

normalization的方式有: 時態轉換, 單複數轉換, 同義詞轉換, 大小寫轉換等.

比如: 文件中包含 “mom likes small dogs”, 在建立索引時通過normalization處理, 通過 “mother liked little dog” 也能搜尋到相關的文件.

2 ES的預設分析器

  • ES中的預設分析器: standard tokenizer, 標準分析器, 以單詞為邊界進行分詞. 具有如下功能:

    standard token filter: 去掉無意義的標籤, 如<>, &, - 等.

    lowercase token filter: 將所有字母轉換為小寫字母.

    stop token filer(預設被禁用): 移除停用詞, 比如"a"、"the"等.

  • 測試預設分析器:

    GET _analyze			// ES引擎中已有standard分詞器, 所以可以不指定index
    {
        "analyzer": "standard", 
        "text": "There-is a DOG<br/> in house &"
    }
    

3 修改分詞器

  • 建立索引後可以新增新的分詞器, 新增之前必須先關閉索引, 新增之後再開啟:

    // 先關閉索引: 
    POST address/_close
    
    // 啟用English停用詞token filter
    PUT address/_settings
    {
        "analysis": {
            "analyzer": {
                "my_token_filter": {		// 自定義的分詞器名稱
                    "type": "standard",
                    "stopwords": "_english_"
                }
            }
        }
    }
    
    // 開啟索引: 
    POST address/_open
    
  • 使用具有停詞功能的分詞器進行分詞:

    GET address/_analyze
    {
        "analyzer": "my_token_filter", 
        "text": "There-is a DOG<br/> in house &"
    }
    
  • 返回結果減少了停用詞:

    {
      "tokens": [
        {
          "token": "dog",
          "start_offset": 11,
          "end_offset": 14,
          "type": "<ALPHANUM>",
          "position": 3
        },
        {
          "token": "br",
          "start_offset": 15,
          "end_offset": 17,
          "type": "<ALPHANUM>",
          "position": 4
        },
        {
          "token": "house",
          "start_offset": 23,
          "end_offset": 28,
          "type": "<ALPHANUM>",
          "position": 6
        }
      ]
    }
    

4 定製分詞器

4.1 向索引中新增自定義的分詞器

注意: 要先關閉索引, 再新增, 然後再開啟索引.

PUT address/_settings
{
    "analysis": {
        "char_filter": {
            "&_to_and": {
                "type": "mapping",
                "mappings": ["&=> and"]
            }
        },
        "filter": {
            "my_stopwords": {
                "type": "stop",
                "stopwords": ["the", "a"]
            }
        },
        "analyzer": {
            "my_analyzer": {			// 自定義的分析器名稱
                "type": "custom",
                "char_filter": ["html_strip", "&_to_and"],	// 跳過HTML標籤, 將&符號轉換為"and"
                "tokenizer": "standard",
                "filter": ["lowercase", "my_stopwords"]		// 轉換為小寫
            }
        }
    }
}

4.2 測試自定義分析器

GET address/_analyze
{
    "analyzer": "my_analyzer", 
    "text": "There-is a DOG<br/> in house &"
}

響應結果中已經對大寫單詞、HTML標籤, 以及"&"做了處理. 鑑於篇幅所限, 這裡省去.

4.3 向對映中新增自定義的分析器

PUT address/_mapping/province
{
    "properties": {
        "content": {
            "type": "text",
            "analyzer": "my_analyzer"
        }
    }
}

此時檢視mapping資訊:

PUT address/_mapping/province
{
    "properties": {
        "content": {
            "type": "text",
            "analyzer": "my_analyzer"
        }
    }
}

發現自定義的分析器已經配置到province上了:

{
  "address": {
    "mappings": {
      "province": {
        "properties": {
          "content": {
            "type": "text",
            "analyzer": "my_analyzer"
          },
          "description": {
            "type": "text"
          }
        }
      }
    }
  }
}

版權宣告

作者: ma_shoufeng(馬瘦風)

出處: CSDN 馬瘦風的部落格

您的支援是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究相關人員法律責任的權利.