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”: {
"analyzer": {
"my_fingerprint_analyzer": {
"type": "fingerprint",
"stopwords": "_english_"
}
}
} } }
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" ] } } } } }
- 自定义的 token filter 中,english_keywords 一般不要使用,除非你想把其中的单词不做词干分析处理;
- english analyze
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 字符串中,反斜杠 “\” 需要用转义字符;
- 复杂例子:将文本以驼峰命名的规则进行切分单词;
- 正则表达式解释说明:
```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 )
简单例子:正则匹配 非单词 或 “_” 作为分隔符来切分单词,并且转化小写;
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": [ ] } } } } }