ES學習記錄10.3——ES分析器4(字符過濾器)

字符過濾器(Character filters)用於在將字符流傳遞給標記生成器Tokenizer以前對其進行預處理,它負責將最原始的文本做爲字符流進行接受,能夠對經過添加、移除或改變字符的方式改變流。好比一個字符過濾器能夠用來轉換印度-阿拉伯數字٠‎١٢٣٤٥٦٧٨‎٩變成等價的阿拉伯語數字0123456789,或者從流中刪除<b>這樣的HTML元素。ES有不少內置的字符過濾器,能夠用於自定義的分析器中,主要有:html

HTML Strip Character Filter:html_strip字符過濾器能夠將流中的相似於<b>這樣的HTML標籤元素移除,並對HTML中相似於&這樣的實體進行解碼;
Mapping Character Filter:mapping字符過濾器(映射字符過濾器)使用指定的替換字符替換指定字符串的任何出現的內容;
Pattern Replace Character Filter:pattern_replace字符過濾器將與正則表達式匹配的任何字符替換爲指定的替換內容;
1. html標籤字符過濾器(HTML Strip Char Filter)
 html_strip字符過濾器從文本中刪除HTML元素,並用其解碼值替換HTML實體(如用&替換&,在HTML語言中&就是表示&),如:java

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "tokenizer":      "keyword",
  "char_filter":  [ "html_strip" ],
  "text": "<p>I'm so <b>happy</b>!</p>"
}
'
1
2
3
4
5
6
7
返回的結果爲[\nI'm so happy!\n],其中將HTML中的<p>轉換爲\n,將'轉換爲'。html_strip字符過濾器是可配置的,接受的參數有:正則表達式

escaped_tags:表示一個包含HTML標籤元素的列表(刪除的HTML元素時,就將原始文本中出現的元素和這個列表中元素對比,若是是HTML元素且在該參數指定的列表中出現則保留,不然就移除);
下面是栗子:json

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": ["my_char_filter"]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip",
          // 配置不移除的HTML標籤
          "escaped_tags": ["b"]
        }
      }
    }
  }
}
'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
而後用上述的分析器my_analyzer分析文本<p>I'm so <b>happy</b>!</p>獲得的結果爲:[\nI'm so <b>happy</b>!\n]。數組

2. 映射字符過濾器(Mapping Char Filter)
 mapping字符過濾器接受key-value這樣鍵-值對形式的映射,只要映射字符過濾器遇到映射表中key就將它替換成相應的value。在匹配key時是採用貪婪匹配,在給定點處的最長模式匹配獲勝,替換的字符串容許爲空字符串(即key對應的value值能夠爲空字符串)。mapping字符過濾器是可配置的,可接受的參數有:app

mappings:是一個映射的數組,每一個元素都是key => value鍵值對形式;
mappings_path:表示一個包含上述mappings中key => value內容的UTF-8編碼的文件路徑(能夠是絕對路徑或相對ES配置文件config的路徑,注意若是是這中文件方式,那麼一行只能有一個key => value鍵值對);
【注】上述兩個參數必須有且僅有一個,不像別的參數無關緊要。curl

下面是栗子:編碼

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "٠ => 0",
            "١ => 1",
            "٢ => 2",
            "٣ => 3",
            "٤ => 4",
            "٥ => 5",
            "٦ => 6",
            "٧ => 7",
            "٨ => 8",
            "٩ => 9"
          ]
        }
      }
    }
  }
}
'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
用上述的分析器my_analyzer分析文本My license plate is ٢٥٠١٥,最後獲得的結果爲[My license plate is 25015]。url

3. 模式替換字符過濾器(Pattern Replace Char Filter)
 pattern_replace字符過濾器使用正則表達式去匹配原始文本中的字符,而後用指定的字符去替換匹配上的字符。替換字符串能夠引用正則表達式中的捕獲內容。pattern_replace字符過濾器是可配置的,可接受的參數有:.net

pattern:一個Java正則表達式,必選參數;
replacement:用於替換在原始文本中匹配上的內容,能夠引用匹配的內容(使用$1..$9的形式引用正則匹配上的第1處…第9處內容);
flags:java正則表達式中的標誌,標誌應該是管道分開的,好比CASE_INSENSITIVE|COMMENTS;
下面是栗子:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' {   "settings": {     "analysis": {       "analyzer": {         "my_analyzer": {           "tokenizer": "standard",           "char_filter": [             "my_char_filter"           ]         }       },       "char_filter": {         "my_char_filter": {           "type": "pattern_replace",           "pattern": "(\\d+)-(?=\\d)",           "replacement": "$1_"         }       }     }   } } ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 上述配置的正則表示是(\\d+)-(?=\\d),將匹配的內容替換爲正則表達式中匹配的第一處內容,那該分析器分析文本My credit card is 123-456-789獲得的結果爲[My, credit, card, is, 123_456_789]。

相關文章
相關標籤/搜索