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

上一篇:nginx-配置文件


下一篇:window 10安装和使用Elastic APM Server