1. 程式人生 > >elasticsearch文件-analysis

elasticsearch文件-analysis

analysis

基本概念
===

全文搜尋引擎會用某種演算法對要建索引的文件進行分析, 從文件中提取出若干Token(詞元), 這些演算法稱為Tokenizer(分詞器), 這些Token會被進一步處理, 比如轉成小寫等, 這些處理演算法被稱為Token Filter(詞元處理器), 被處理後的結果被稱為Term(詞), 文件中包含了幾個這樣的Term被稱為Frequency(詞頻)。 引擎會建立Term和原文件的Inverted Index(倒排索引), 這樣就能根據Term很快到找到源文件了。    文字被Tokenizer處理前可能要做一些預處理, 比如去掉裡面的HTML標記, 這些處理的演算法被稱為Character Filter(字元過濾器), 這整個的分析演算法被稱為Analyzer(分析器)。 

ES內建了很多Analyzer, 還有很多第三方的Analyzer外掛, 比如一些處理中文的Analyzer(中文分詞)。 

analyzer、 tokenizer、 filter可以在elasticsearch.yml 配置, 下面是配置例子

```
index :
    analysis :
        analyzer :
            standard :
                type : standard
                stopwords : [stop1, stop2]
            myAnalyzer1 :
                type : standard
                stopwords : [stop1, stop2, stop3]
                max_token_length : 500
            # configure a custom analyzer which is
            # exactly like the default standard analyzer
            myAnalyzer2 :
                tokenizer : standard
                filter : [standard, lowercase, stop]
        tokenizer :
            myTokenizer1 :
                type : standard
                max_token_length : 900
            myTokenizer2 :
                type : keyword
                buffer_size : 512
        filter :
            myTokenFilter1 :
                type : stop
                stopwords : [stop1, stop2, stop3, stop4]
            myTokenFilter2 :
                type : length
                min : 0
                max : 2000

```

analyzer
===

ES內建若干analyzer, 另外還可以用內建的character filter, tokenizer, token filter組裝一個analyzer(custom analyzer), 比如

```
index :
    analysis :
        analyzer :
            myAnalyzer :
                tokenizer : standard
                filter : [standard, lowercase, stop]
```

如果你要使用第三方的analyzer外掛,需要先在配置檔案elasticsearch.yml中註冊, 下面是配置IkAnalyzer的例子

```
index:
  analysis:
    analyzer:      
      ik:
          alias: [ik_analyzer]
          type: org.elasticsearch.index.analysis.IkAnalyzerProvider

```

當一個analyzer在配置檔案中被註冊到一個名字(logical name)下後,在mapping定義或者一些API裡就可以用這個名字來引用該analyzer了,比如

```
"message": {
    "type": "string",
    "indexAnalyzer": "ik",
    "searchAnalyzer": "ik"
}
```

如果沒有指定索引和搜尋用的analyzer,ES會用預設的analyzer來處理,也就是名字(logical name)為`default`, `default_index`, `default_search`的analyzer。 
從名字可以看出來,`default`是索引和搜尋時用的預設的analyzer,`default_index`是索引時用的預設的analyzer, 
`default_search`是查詢時用的預設analyzer。

下面是在elasticsearch.yml中配置預設analyzer的例子

```
index:
  analysis:
    analyzer:
        default_index:
            tokenizer: standard
            filter: [standard, lowercase, my_synonym, my_snow]
        default_search:
            tokenizer: standard
            filter: [standard, lowercase, stop]
```
或者用這種格式

```
index.analysis.analyzer.default.type : "mmseg"

```

一個analyzer可以起若干別名,比如在下面的例子中,standard analyzer可以用alias1或者alias2來引用

```
index :
  analysis :
    analyzer。 :
      standard :
        alias: [alias1, alias2]
        type : standard
        stopwords : [test1, test2, test3]
```

下面是內建的一些analyzer。

| analyzer              | logical name  | description                               |
| ----------------------|:-------------:| :-----------------------------------------|
| standard analyzer     | standard      | standard tokenizer, standard filter, lower case filter, stop filter |
| simple analyzer       | simple        | lower case tokenizer                      |
| stop analyzer         | stop          | lower case tokenizer, stop filter         |
| keyword analyzer      | keyword       | 不分詞,內容整體作為一個token(not_analyzed) |
| pattern analyzer      | whitespace    | 正則表示式分詞,預設匹配\W+                 |
| language analyzers    | [lang](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html)  | 各種語言 |
| snowball analyzer     | snowball      | standard tokenizer, standard filter, lower case filter, stop filter, snowball filter |
| custom analyzer       | custom        | 一個Tokenizer, 零個或多個Token Filter, 零個或多個Char Filter |

tokenizer
===

ES內建的tokenizer列表。

| tokenizer             | logical name  | description                           |
| ----------------------|:-------------:| :-------------------------------------|
| standard tokenizer    | standard      |                                       |
| edge ngram tokenizer  | edgeNGram     |                                       |
| keyword tokenizer     | keyword       | 不分詞                                 |
| letter analyzer       | letter        | 按單詞分                               |
| lowercase analyzer    | lowercase     | letter tokenizer, lower case filter   |
| ngram analyzers       | nGram         |                                       |
| whitespace analyzer   | whitespace    | 以空格為分隔符拆分                      |
| pattern analyzer      | pattern       | 定義分隔符的正則表示式                  |
| uax email url analyzer| uax_url_email | 不拆分url和email                       |
| path hierarchy analyzer| path_hierarchy| 處理類似`/path/to/somthing`樣式的字串|


token filter
===

ES內建的token filter列表。

| token filter          | logical name  | description                           |
| ----------------------|:-------------:| :-------------------------------------|
| standard filter       | standard      |                                       |
| ascii folding filter  | asciifolding  |                                       |
| length filter         | length        | 去掉太長或者太短的                      |
| lowercase filter      | lowercase     | 轉成小寫                               |
| ngram filter          | nGram         |                                       |
| edge ngram filter     | edgeNGram     |                                       |
| porter stem filter    | porterStem    | 波特詞幹演算法                            |
| shingle filter        | shingle       | 定義分隔符的正則表示式                  |
| stop filter           | stop          | 移除 stop words                        |
| word delimiter filter | word_delimiter| 將一個單詞再拆成子分詞                   |
| stemmer token filter  | stemmer       |                                        |
| stemmer override filter| stemmer_override|                                     |
| keyword marker filter | keyword_marker|                                        |
| keyword repeat filter | keyword_repeat|                                        |
| kstem filter          | kstem         |                                        |
| snowball filter       | snowball      |                                        |
| phonetic filter       | phonetic      | [外掛](https://github.com/elasticsearch/elasticsearch-analysis-phonetic) |
| synonym filter        | synonyms      | 處理同義詞                              |
| compound word filter  | dictionary_decompounder, hyphenation_decompounder | 分解複合詞  |
| reverse filter        | reverse       | 反轉字串                              |
| elision filter        | elision       | 去掉縮略語                              |
| truncate filter       | truncate      | 截斷字串                              |
| unique filter         | unique        |                                        |
| pattern capture filter| pattern_capture|                                       |
| pattern replace filte | pattern_replace| 用正則表示式替換                        |
| trim filter           | trim          | 去掉空格                                |
| limit token count filter| limit       | 限制token數量                           |
| hunspell filter       | hunspell      | 拼寫檢查                                |
| common grams filter   | common_grams  |                                        |
| normalization filter  | arabic_normalization, persian_normalization |          |


character filter
===

ES內建的character filter列表

| character filter          | logical name  | description               |
| --------------------------|:-------------:| :-------------------------|
| mapping char filter       | mapping       | 根據配置的對映關係替換字元   |
| html strip char filter    | html_strip    | 去掉HTML元素               |
| pattern replace char filter| pattern_replace| 用正則表示式處理字串    |


icu plugin
===

[icu analysis 外掛](https://github.com/elasticsearch/elasticsearch-analysis-icu)

http://www.csdn123.com/html/itweb/20131030/195710.htm