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则没有被提取词干。