Elastic-Language analyzer

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 的结果。这是因为organorganization有相同的词根:organ。通常这个不是什么大问题,但是在一些特殊的文档中就会导致有歧义的结果,所以我们希望防止单词organizationorganizations被缩减为词干。

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

Elastic-Language analyzer

上一篇:docker学习


下一篇:[题解]HDU5756 Boss Bo