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

    弯弯月亮,只为美好的自己。
  • 相关阅读:
    复杂数据权限设计方案
    HTTP 错误 500.24
    C# 树形结构tree拼接
    MVC View返回list列表
    springboot使用validation 插件做数据校验
    java导出excel,多表头合并
    微信小程序表单验证
    springboot跑定时任务
    Springboot 上传excel并解析文件内容
    jmeter基本使用
  • 原文地址:https://www.cnblogs.com/Choleen/p/15221436.html
Copyright © 2020-2023  润新知