Language analyzer
支持如下语种:
-
arabic, 美 /ˈærəbɪk/ 阿拉伯语
-
armenian, 美 /ɑːrˈmiːniən/ 亚美尼亚语
-
basque, 美 /bæsk,bɑːsk/ 巴斯克语
-
bengali, 美 /beŋˈɡɑːli/ 孟加拉语
-
brazilian, 美 /brəˈzɪliən/ 巴西语
-
bulgarian, 美 /bʌlˈɡeriən/ 保加利亚语
-
catalan, 美 /ˈkætəlæn/ 加泰罗尼亚语
-
cjk, 中日韩统一表意文字
-
czech, 美 /tʃek/ 捷克语
-
danish, 美 /ˈdeɪnɪʃ/ 丹麦语
-
dutch, 美 /dʌtʃ/ 荷兰语
-
english, 美 /ˈɪŋɡlɪʃ/ 英语
-
estonian, 美 /eˈstoʊniən/ 爱沙尼亚语
-
finnish, 美 /ˈfɪnɪʃ/ 芬兰语
-
french, 美 /frentʃ/ 法语
-
galician, 美 /ɡəˈlɪʃn/ 加里西亚语
-
german, 美 /ˈdʒɜːrmən/ 德语
-
greek, 美 /ɡriːk/ 希腊语
-
hindi, 美 /ˈhɪndi/ 北印度语
-
hungarian, 美 /hʌŋˈɡeriən/ 匈牙利语
-
indonesian, 美 /ˌɪndəˈniːʒn/ 印度尼西亚语
-
irish, 美 /ˈaɪrɪʃ/ 爱尔兰语
-
italian, 美 /ɪˈtæliən/ 意大利语
-
latvian, 美 /ˈlætviən/ 拉脱维亚语
-
lithuanian, 美 /ˌlɪθuˈeɪniən/ 立陶宛语
-
norwegian, 美 /nɔːrˈwiːdʒən/ 挪威语
-
persian, /'pɜːrʒən/ 波斯语
-
portuguese, 美 /ˌpɔːrtʃʊˈɡiːz/ 葡萄牙语
-
romanian, 美 /ro'menɪən/ 罗马尼亚语
-
russian, 美 /ˈrʌʃn/ 俄语
-
sorani, 索拉尼语
-
spanish, 美 /ˈspænɪʃ/ 西班牙语
-
swedish, 美 /ˈswiːdɪʃ/ 瑞典语
-
turkish, 美 /ˈtɜːrkɪʃ/ 土耳其语
-
thai. 美 /taɪ/ 泰语
重新实现语言分词器
这个内置语言分词器可以作为自定义分词器去实现,为了定制它们的行为。
NOTE
如果你不打算排除被提取词干的单词(相当于上面的stem_exclusion参数),那么你应该从自定义分析器配置中删除keyword_marker标记过滤器。
词干提取排除
例如一个句子World Health Organization,这个跟分词替换为organ health 的结果。这是因为organ和organization有相同的词根:organ。通常这个不是什么大问题,但是在一些特殊的文档中就会导致有歧义的结果,所以我们希望防止单词organization和organizations被缩减为词干。
english analyzer
PUT /my_index
{
"mappings": {
"blog": {
"properties": {
"title": {
"type": "string",
"analyzer": "english" // [1]
}
}
}
}
}
- 【1】 title字段将会用english(英语)分析器替换默认的standard(标准)分析器
GET /my_index/_analyze?field=title
I'm not happy about the foxes
这个分词为:
i'm,happi,about,fox
我们无法分辨源文档中是包含单数 fox 还是复数 foxes ;单词 not 因为是停用词所以被移除了, 所以我们无法分辨源文档中是happy about foxes还是not happy about foxes,虽然通过使用 english (英语)分析器,使得匹配规则更加宽松,我们也因此提高了召回率,但却降低了精准匹配文档的能力。
为了获得两方面的优势,我们可以使用multifields(多字段)对 title 字段建立两次索引: 一次使用 english(英语)分析器,另一次使用 standard(标准)分析器:
PUT /my_index
{
"mappings": {
"blog": {
"properties": {
"title": { // [1]
"type": "string",
"fields": {
"english": { // [2]
"type": "string",
"analyzer": "english"
}
}
}
}
}
}
}
-
[1]主 title 字段使用 standard(标准)分析器。
-
[2]title.english 子字段使用english(英语)分析器
替换为该字段映射后,我们可以索引一些测试文档来展示怎么在搜索时使用两个字段。
PUT /my_index/blog/1
{ "title": "I'm happy for this fox" }
PUT /my_index/blog/2
{ "title": "I'm not happy about my fox problem" }
GET /_search
{
"query": {
"multi_match": {
"type": "most_fields", // [1]
"query": "not happy foxes",
"fields": [ "title", "title.english" ]
}
}
}
- [1] 使用most_fields query type(多字段搜索语法)让我们可以用多个字段来匹配同一段文本。
czech analyzer
这个捷克语分词器可以被实现,作为一个自定义的分词器。
PUT /czech_example
{
"settings": {
"analysis": {
"filter": {
"czech_stop": {
"type": "stop",
"stopwords": "_czech_" // [1]
},
"czech_keywords": {
"type": "keyword_marker",
"keywords": ["příklad"] // [2]
},
"czech_stemmer": {
"type": "stemmer",
"language": "czech"
}
},
"analyzer": {
"rebuilt_czech": {
"tokenizer": "standard",
"filter": [
"lowercase",
"czech_stop",
"czech_keywords",
"czech_stemmer"
]
}
}
}
}
}
注释
-
[1] 这个默认的停止词可以被覆盖,设置这个stopwords 或者 stopwords_path
-
[2] 这个过滤器可以被删除,除非有一些单词应该被排除在词干中。
例子
GET /_analyze
{
"tokenizer": "whitespace",
"filter": [ "stemmer" ],
"text": "fox running and jumping"
}
这个请求会产生如下的一些词组,比如running会被提取词干为run 和 jumping被提取为jump。
[ fox, run, and, jump ]
若不想被提取词干,则需要对单词进行标记,即keyword_marker参数过滤
GET /_analyze
{
"tokenizer": "whitespace",
"filter": [
{
"type": "keyword_marker",
"keywords": [ "jumping" ]
},
"stemmer"
],
"text": "fox running and jumping"
}
如下则为提取结果:
[ fox, run, and, jumping ]
jumping则没有被提取词干。