文章目录
1. 自带的analyzer
- standard analyzer: 按照unicode 定义的word boundary进行切分,会移除大部分的标点符号,并且将token转成小写,同时支持自定义一些stop words。
- simple analyzer: 遇到不是letter的char就切词,并且将token转化为小写。
- whitespace analyzer: 遇到空格时切词,不会进行小写转换
- stop analyzer: 在simple analyzer的基础上增加了stop words的功能
- keyword analyzer: 会将所有的输入当做一个token输出
- pattern analyzer: 使用正则匹配的值作为切分点得到token,支持lowercase convert 和 stop words
- language analyzer: es提供了一些语言识别的analyzer
- fingerprint analyzer: 会将输入进行lowercase,sorted,deduplicated 然后连接成一个token输出
1. 主要analyzer的解析
1. standard analyzer
按照unicode 定义的word boundary进行切分,会移除大部分的标点符号,并且将token转成小写,同时支持自定义一些stop words。
1.配置信息
max_token_length: token的最大长度,默认为255
stopwords: 停用词,可以引用一些预定义的(比如_english_,参考stop token filter 可以看到这些预定义的信息 这里),也可以直接在这里定一个一个word list. 这里的配置默认为none,就是不进行stop
stopwords_path: 可以引用一个文件中定义的停用词
2.定义analyzer
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 ]
3.拆解analyzer
standard analyzer的组成是
- standard tokenizer
- [lowercase-token-filter, stop-token-filter(该filter默认没有启用)]
没有使用char_filter
所以我们也可以借助standard来快速自顶一个standard analyzer
PUT /standard_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_standard": {
"tokenizer": "standard",
"filter": [
]
}
}
}
}
}
POST standard_example/_analyze
{
"analyzer": "rebuilt_standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
返回
[The,2,QUICK,Brown-Foxes,jumped,over,the,lazy,dog's,bone]
注意,这里是定义了一个新的analyzer,叫 rebuilt_standard ,原来的standard analyzer并没有被改变。
这里可以看到没有进行小写转换。
2. simple analyzer
遇到不是letter的char就切词,并且将token转化为小写。
1.配置信息
无
2.定义analyzer
以为没有配置,所以不需要设置
3.拆解,重组analyzer
- lowercase-tokenizer ,只有这一个tokenizer,别的没有
PUT /simple_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_simple": {
"tokenizer": "lowercase",
"filter": [
]
}
}
}
}
}
3. whitespace analyzer
遇到空格时切词,不会进行小写转换
1.配置信息
无
2.定义analyzer
不需要配置
3.拆解analyzer
- 只有white-space tokenizer
PUT /whitespace_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_whitespace": {
"tokenizer": "whitespace",
"filter": [
]
}
}
}
}
4. stop analyzer
在simple analyzer的基础上增加了stop words的功能
1.配置信息
stopwords: 和standard analyzer配置一致
stopwords_path: 和standard analyzer 配置一致
2.定义analyzer
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."
}
3.拆解analyzer
lowercase-tokenizer
stop-token-filter
PUT /stop_example
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"rebuilt_stop": {
"tokenizer": "lowercase",
"filter": [
"english_stop"
]
}
}
}
}
}
5. keyword analyzer: 会将所有的输入当做一个token输出
1.配置信息
无
2.定义analyzer
不需要
3.拆解analyzer
只有 Keyword Tokenizer
PUT /keyword_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_keyword": {
"tokenizer": "keyword",
"filter": [
]
}
}
}
}
}
6. pattern analyzer
使用正则匹配的值作为切分点得到token,支持lowercase convert 和 stop words
1.配置信息
pattern
flags
lowercase
stopwords
stopwords_path
2.定义analyzer
PUT my_index
{
"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 ]
3.拆解analyzer
Pattern Tokenizer
Lower Case Token Filter,Stop Token Filter(默认没有开启)
PUT /pattern_example
{
"settings": {
"analysis": {
"tokenizer": {
"split_on_non_word": {
"type": "pattern",
"pattern": "\\W+"
}
},
"analyzer": {
"rebuilt_pattern": {
"tokenizer": "split_on_non_word",
"filter": [
"lowercase"
]
}
}
}
}
}
7. language analyzer: es提供了一些语言识别的analyzer
不看了,这个感觉暂时用不上,也不会其他的外语,不好测试😂
1.配置信息
2.定义analyzer
3.拆解analyzer
8. fingerprint analyzer
会将输入进行lowercase,sorted,deduplicated 然后连接成一个token输出
1.配置信息
separator:连接term使用的字符,默认是space
max_output_size:产生的token的最大长度,默认255
stopwords: 和standard analyzer配置一致
stopwords_path: 和standard analyzer 配置一致
2.定义analyzer
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."
}
返回
[ consistent godel said sentence yes ]
上面返回的结果中间没有逗号哦,是一个词。
3.拆解analyzer
Standard Tokenizer
下面的都是token filter
Lower Case Token Filter
ASCII folding
Stop Token Filter
Fingerprint
https://unicode.org/reports/tr29/#Word_Boundaries
2. analyze API使用
测试analyze API可以使用下面四种方式
GET /_analyze
POST /_analyze
GET /<index>/_analyze
POST /<index>/_analyze
在传入参数的时候,可以直接使用analyzer进行使用,也可以使用 char_filter
, filter
, tokenizer
来进行analyze的测试和使用
在测试的时候,当使用分解的组件进行测试的时候,准寻上面介绍analyzer的结构介绍,tokenizer 是必须品,其他的都是可有可无的。
POST _analyze
{
"analyzer": "whitespace",
"text": "The quick brown fox."
}
POST _analyze
{
"tokenizer": "keyword",
"char_filter": [ "html_strip" ],
"text": "<p>I'm so <b>happy</b>!</p>"
}
POST _analyze
{
"tokenizer": "standard",
"filter": [ "lowercase", "asciifolding" ],
"text": "Is this déja vu?"
}
3. 自定义一个analyzer
PUT analyze_test
{
"settings": {
"analysis": {
"analyzer":{
"my_analyzer":{
"tokenizer":"standard",
"char_filter":["my_char_filter","html_strip"], #过滤html,增加映射
"filter":["my_stem_filter"] # 词干提取
}
},
"char_filter": {
"my_char_filter":{
"type":"mapping",
"mappings":[
"a => b",
"c => d"
]
}
},
"filter": {
"my_stem_filter":{
"type":"stemmer",
"name":"english"
}
}
}
}
}
GET analyze_test/_analyze
{
"analyzer": "my_analyzer",
"text":["<div>aa</div>i want to going shoping"]
}
返回
["bb"," i"," wbnt"," to"," go"," shope"]
待补充
4. 实际业务场景实现
待补充
测试一下char_filter导致原来的text长度发生变化进而影响了高亮问题的情况