1. Fingerprint analyzer

  • Fingerprint analyzer 实现了 fingerprinting 算法 (OpenRefine项目中使用)。
  • 使用该 analyzer 场景下,文本会被转为小写格式,经过规范化 (normalize) 处理之后移除扩展字符,然后再经过排序,删除重复数据组合为单个 token;如果配置了停用词,则停用词也将会被移除。

  • 底层组成模块:

    • Tokenizer:Standard Tokenizer;
    • Token Filters:
      • Lower Case Token Filter
      • ASCII folding
      • Stop Token Filter ( 默认未开启 )
      • Fingerprint
  • 可配置参数: | 参数 | 参数说明 | | :—-: | :—-: | | separator | 连接多个词(term)的字符,默认为空格 | | maxoutput_size | token 允许的最大值,超过该值将直接被丢弃,默认值为255 | | stopwords | 预定义的停用词,可以为0个或多个,例如 _english 或停用词数组,默认值为none | | stopwords_path | 停用词文件路径 |

  • 举个例子: ```json

    配置索引默认Analyzer,移除english停用词列表中的词

    PUT my_index { “settings”: { “analysis”: {

    1. "analyzer": {
    2. "my_fingerprint_analyzer": {
    3. "type": "fingerprint",
    4. "stopwords": "_english_"
    5. }
    6. }

    } } }

POST my_index/_analyze { “analyzer”: “my_fingerprint_analyzer”, “text”: “Yes yes, Gödel said this sentence is consistent and.” }

#文本处理后是一个去重、排序、小写化、移除扩展符和stopword的单个token

{ “tokens” : [ { “token” : “consistent godel said sentence yes”, “start_offset” : 0, “end_offset” : 52, “type” : “fingerprint”, “position” : 0 } ] }


- 如果通过配置参数来微调 Fingerprint Analyzer 已经满足不了需求的话,可以通过组合底层模块来重建一个类似 Fingerprint 的自定义 Analyzer,通常可以靠添加 token filter 来改变它;
```json
PUT /fingerprint_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_fingerprint": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding",
            "fingerprint"
          ]
        }
      }
    }
  }
}

2. Keyword analyzer

  • Keyword analyzer 视字符串为一个整体不进行分词处理;
  • 底层组成模块:
    • Tokenizer:Keyword Tokenizer
  • 没有可配置参数
  • 也可以重建 keyword analyzer,通过添加 token filter 来定制需求:
    PUT /keyword_example
    {
    "settings": {
      "analysis": {
        "analyzer": {
          "rebuilt_keyword": {
            "tokenizer": "keyword",
            "filter": []
          }
        }
      }
    }
    }
    

3. Language analyzer

  • Language analyzer 是特定类型语言的分词器,支持以下语系:支持以下类型:阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、中日韩语、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、加利西亚语、德语、希腊语、印地语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、拉脱维亚语、立陶宛语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、索拉尼语、西班牙语、瑞典语、土耳其语、泰语。
  • 可配置参数: | 参数 | 参数说明 | | :—-: | :—-: | | stopwords | ES 内部预定义的停用词,可以为0个或多个,例如 english 或自定义的stopword 数组 | | stopwords_path | 使用外部的 stopwords 文件 | | stem_exclusion | 部分语言支持在词干提取时忽略一组小写格式的单词列表 |

  • 重建 Language analyzer,例如,如果你不想做词干转化(相当于 stem_exclusion),那么就可以在自定义 Analyzer 中移除 keyword_marker token filter;

  • 举例:
    • english analyze
      • 自定义的 token filter 中,english_keywords 一般不要使用,除非你想把其中的单词不做词干分析处理;
        PUT /english_example
        {
        "settings": {
        "analysis": {
        "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        },
        "english_keywords": {
          "type":       "keyword_marker",
          "keywords":   ["example"] 
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english"
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        }
        },
        "analyzer": {
        "rebuilt_english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_keywords",
            "english_stemmer"
          ]
        }
        }
        }
        }
        }
        

4. Pattern analyzer

  • Pattern analyzer 使用正则表达式作为文本分词规则;
  • 注意:正则表达式匹配的应该是 token 分隔符,而不是去匹配 token 本身,默认正则为 \W+ (匹配非单词字符);
  • Pattern analyzer 使用的是 Java 正则表达式;
  • 注意:糟糕的正则表达式可能会运行的很慢,甚至会抛出异常并导致运行终止;

  • 底层模块组成:

    • Tokenizer:Pattern Tokenizer;
    • Token Filter:
      • Lower Case Token Filter;
      • Stop Token Filter;(默认未启用)
  • 重建 Pattern Analyzer:

    #自定义一个 tokenizer:split_on_non_word,然后在自定义的 analyzer 中引用这个 tokenizer
    PUT /pattern_example
    {
    "settings": {
      "analysis": {
        "tokenizer": {
          "split_on_non_word": {
            "type":       "pattern",
            "pattern":    "\\W+" 
          }
        },
        "analyzer": {
          "rebuilt_pattern": {
            "tokenizer": "split_on_non_word",
            "filter": [
              "lowercase"       
            ]
          }
        }
      }
    }
    }
    
  • 可配置参数: | 参数 | 参数说明 | | :—-: | :—-: | | pattern | java正则表达式,默认为 \W+ | | flags | java正则当中的 flags,flags应该用 | 分割,如”CASEINSENSITIVE|COMMENTS” | | lowercase | 分隔出的词(term)是否以小写形式表示,默认为true | | stopwords | 预定义的停用词,可以为0个或多个,例如_english或数组类型值,默认值为none | | stopwords_path | 停用词外部文件路径 |

  • 举例:

    • 简单例子:正则匹配 非单词 或 “_” 作为分隔符来切分单词,并且转化小写;
      • 注意:正则表达式在 JSON 字符串中,反斜杠 “\” 需要用转义字符;
    • 复杂例子:将文本以驼峰命名的规则进行切分单词;
      • 正则表达式解释说明:
        ([^\p{L}\d]+)                 # swallow non letters and numbers,
        | (?<=\D)(?=\d)                 # or non-number followed by number,
        | (?<=\d)(?=\D)                 # or number followed by non-number,
        | (?<=[ \p{L} && [^\p{Lu}]])    # or lower case
        (?=\p{Lu})                    #   followed by upper case,
        | (?<=\p{Lu})                   # or upper case
        (?=\p{Lu}                     #   followed by upper case
        [\p{L}&&[^\p{Lu}]]          #   then lower case
        )
        
        ```json
        简单例子:正则匹配 非单词 或 “_” 作为分隔符来切分单词,并且转化小写;
        PUT myindex { “settings”: { “analysis”: { “analyzer”: { “my_email_analyzer”: { “type”: “pattern”, “pattern”: “\W|“, “lowercase”: true } } } } }

POST my_index/_analyze { “analyzer”: “my_email_analyzer”, “text”: “John_Smith@foo-bar.com” }

结果:[ john, smith, foo, bar, com ]
复杂例子:将文本以驼峰命名的规则进行切分单词;

PUT my_index { “settings”: { “analysis”: { “analyzer”: { “camel”: { “type”: “pattern”, “pattern”: “([^\p{L}\d]+)|(?<=\D)(?=\d)|(?<=\d)(?=\D)|(?<=[\p{L}&&[^\p{Lu}]])(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}[\p{L}&&[^\p{Lu}]])” } } } } }

GET my_index/_analyze { “analyzer”: “camel”, “text”: “MooseX::FTPClass2_beta” }

结果:[ moose, x, ftp, class, 2, beta ]

<a name="IZtIo"></a>
# 5. Simple analyzer

- Simple analyzer 是根据非字母字符(如数字、空格、连字符和撇号)对文本进行拆分,且将处理的所有关 token 转换成小写格式;
- **无可配置参数**
- **底层模块组成:**
   - Tokenizer:Lowercase Tokenizer;
- 重建 Simple analyzer:根据需求添加 token filter;
```json
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_simple_analyzer": {
          "tokenizer": "lowercase",
          "filter": [                          
          ]
        }
      }
    }
  }
}

6. Standard analyzer

  • Standard analyzer 是 ES 默认的 analyzer,它提供了基于语法的切分词处理(基于 Unicode 文本分割算法),并且适用于大多数语言。
  • 可配置参数: | 参数 | 参数说明 | | :—-: | :—-: | | maxtoken_length | token 最大长度,如果超过此长度的 token,则按照最大长度再次拆分,默认值255 | | stopwords | 预定义的停用词,可以为0个或多个,例如_english或数组类型值,默认值为none | | stopwords_path | 停用词外部文件路径 |

  • 底层模块组成:

    • Tokenizer:Standard Tokenizer;
    • Token filter:
      • Lowercase Token filter;
      • Stop Token filter;(默认未启用)
  • 举例: ```json PUT my_index { “settings”: { “analysis”: {
    "analyzer": {
      "my_english_analyzer": {
        "type": "standard",
        "max_token_length": 5,
        "stopwords": "_english_"
      }
    }
    
    } } }

POST my_index/_analyze { “analyzer”: “my_english_analyzer”, “text”: “The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone.” }

结果:[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog’s, bone ]

<a name="tc1bC"></a>
# 7. Stop analyzer

- stop analyzer 与 simple analyzer 功能一样,不同之处在于支持停用词,默认情况下使用 _english_ 停用词;
- **可配置参数:**
| **参数** | **参数说明** |
| :---: | :---: |
| stopwords | 预定义的停用词,可以为0个或多个,例如_english_或数组类型值,默认值为_none_ |
| stopwords_path | 停用词外部文件路径 |

- **底层模块组成:**
   - Tokenizer:Lowercase Tokenizer;
   - Token filter:Stop Token filter;
- **举例:**
```json
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
#####结果:[ quick, brown, foxes, jumped, lazy, dog, s, bone ]

8. Whitespace analyzer

  • Whitespace analyzer 根据空白字符将文本拆分;
  • 没有可配置参数
  • 底层模块组成:
    • Tokenizer:Whitespace Tokenizer;
  • 重建:
    PUT /whitespace_example
    {
    "settings": {
      "analysis": {
        "analyzer": {
          "rebuilt_whitespace": {
            "tokenizer": "whitespace",
            "filter": [         
            ]
          }
        }
      }
    }
    }