elasticsearch Analyzer

elasticsearch Analyzer,第1张

elasticsearch Analyzer

elasticsearch文本分析

分析器

字符过滤器分词

分词器的作用词干

词干过滤器 令牌过滤器 测试分词

analyze API

分析分词分析分词令牌过滤器创建索引添加文本分析 分词器

默认分词器自定义分词器指定分词器

内置分词器

html_stripmy_mappings_char_filter pattern_replace character filter

分析器

无论是内置的还是自定义的——只是一个包含三个较低级构建块的包:字符过滤器、标记器和标记过滤器。

字符过滤器

字符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换字符流。 例如,可以使用字符过滤器将印度-阿拉伯数字(٠‎١٢٣٤٥٦٧٨‎٩‎)转换为阿拉伯-拉丁数字(0123456789),或者从流中剥离像这样的HTML元素。

一个分析器可以有零个或多个字符过滤器,它们是按顺序应用的。

分词器

在创建索引的时候需要用到分词器,在使用字符串搜索的时候也会用到分词器,并且这两个地方要使用同一个分词器,否则可能会搜索不出来结果。

分词器的作用

分词器(Analyzer)的作用是把一段文本中的词按规则取出所包含的所有词,对应的是Analyzer类,这是一个抽象类(public abstract class org.apache.lucene.analysis.Analyzer),切分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不同的分词器。 词干

词干提取是将单词简化为词根形式的过程

词干过滤器

算法词干分析器
它们需要很少的设置,并且通常开箱即用。
他们使用很少的内存。
它们通常比字典词干分析器更快。字典词干分析器
字典词干分析器在提供的字典中查找单词,用字典中的词干词替换未词干的词变体。
缺点:

词典质量
词典词干分析器的好坏取决于它的词典。为了正常工作,这些词典必须包含大量单词,定期更新,并随着语言趋势而变化。通常,当字典可用时,它是不完整的,并且其中的一些条目已经过时了。大小和性能
词典词干分析器必须将其词典中的所有单词、前缀和后缀加载到内存中。这可能会使用大量 RAM。低质量的字典在去除前缀和后缀时可能效率较低,这会显着减慢词干提取过程。 令牌过滤器

令牌过滤器接收令牌流,并可以添加、删除或更改令牌。 例如,小写令牌过滤器将所有令牌转换为小写令牌,停止令牌过滤器从令牌流中删除常见单词(停止单词),同义词令牌过滤器将同义词引入令牌流。

令牌过滤器不允许更改每个令牌的位置或字符偏移量。

Analyzer可以有零个或多个令牌过滤器,它们是按顺序应用的。

测试分词 analyze API 分析分词
POST _analyze
{
 "analyzer": "whitespace",
 "text":     "The quick brown fox."
}
分析分词令牌过滤器
POST _analyze
{
 "tokenizer": "standard",
 "filter":  [ "lowercase", "asciifolding" ],
 "text":      "Is this déja vu?"
}
创建索引添加文本分析
PUT my-index-000001
{
 "settings": {
   "analysis": {
     "analyzer": {
       "std_folded": { 
         "type": "custom",
         "tokenizer": "standard",
         "filter": [
           "lowercase",
           "asciifolding"
         ]
       }
     }
   }
 },
 "mappings": {
   "properties": {
     "my_text": {
       "type": "text",
       "analyzer": "std_folded" 
     }
   }
 }
}
分词器 默认分词器 自定义分词器

配置

typeAnalyzer 类型,接受内置Analyzer类型。对于自定义分析器,使用custom或省略此参数tokenizer内置或定制的分词器。(必需的)char_filter可选的内置或自定义字符过滤器数组 。filter可选的内置或自定义令牌过滤器数组 。position_increment_gap当索引一个文本值数组时,Elasticsearch 在一个值的最后一个词和下一个值的第一个词之间插入一个假的“间隙”,以确保一个短语查询不匹配来自不同数组元素的两个词。
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": { `1`
          "char_filter": [
            "emoticons"
          ],
          "tokenizer": "punctuation",
          "filter": [
            "lowercase",
            "english_stop"
          ]
        }
      },
      "tokenizer": {
        "punctuation": { `2`
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "char_filter": {
        "emoticons": { `3`
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "filter": {
        "english_stop": { `4`
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my-index-000001/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": "I'm a :) person, and you?"
}
response:{[我,_happy_,人,你]}

1,为索引分配一个默认的自定义Analyzer,my_custom_analyzer. 此Analyzer使用稍后在请求中定义的自定义标记器、字符过滤器和标记过滤器。该Analyzer也省略了type参数。
2,定义自定义punctuation标记器。
3,定义自定义emoticons字符过滤器。
4,定义自定义english_stop令牌过滤器。

指定分词器

字段

PUT my-index-000001
{
 "mappings": {
   "properties": {
     "title": {
       "type": "text",
       "analyzer": "whitespace"
     }
   }
 }
}

索引

PUT my-index-000001
{
 "settings": {
   "analysis": {
     "analyzer": {
       "default": {
         "type": "simple"
       }
     }
   }
 }
}
内置分词器

Standard Analyzer
所述standardAnalyzer将文本分为在字边界条件,如通过Unicode文本分割算法定义。它删除了大多数标点符号、小写术语,并支持删除停用词。Simple Analyzer
讲除了字母以外的符号全部去除,并且讲所有字符变为小写,需要注意的是这个分词器同样把数据也去除了,同样不支持中文。Whitespace Analyzer
仅仅是去掉了空格,没有其他任何 *** 作,不支持中文。Stop Analyzer
这个和SimpleAnalyzer类似,不过比他增加了一个的是,在其基础上还去除了所谓的stop words,比如the, a, this这些。这个也是不支持中文的StandardAnalyzer
英文方面的处理和StopAnalyzer一样的,对中文支持,使用的是单字切割。Keyword Analyzer
所述keywordAnalyzer是一个“空 *** 作”Analyzer接受任何文本它被赋予并输出完全相同的文本作为一个单一的术语。Pattern Analyzer
所述patternAnalyzer使用一个正则表达式的文本分成条款。它支持小写和停用词。Language Analyzers
Elasticsearch 提供了许多特定于语言的Analyzer,例如english或 french。Fingerprint Analyzer
所述fingerprintAnalyzer是一个专业Analyzer,它产生可用于重复检测指纹。

POST _analyze
{
"analyzer": "fingerprint",
"text": "Yes yes, Gödel said this sentence is consistent and."
}
[ and consistent godel is said sentence this yes ]
html_strip
GET /_analyze
{
"tokenizer": "keyword",
"char_filter": [
  "html_strip"
],
"text": "

I'm so happy!

" } [ nI'm so happy!n ]

使用

PUT /my-index-000001
{
"settings": {
  "analysis": {
    "analyzer": {
      "my_analyzer": {
        "tokenizer": "keyword",
        "char_filter": [
          "html_strip"
        ]
      }
    }
  }
}
}
my_mappings_char_filter
PUT /my-index-000001
{
"settings": {
  "analysis": {
    "analyzer": {
      "my_analyzer": {
        "tokenizer": "standard",
        "char_filter": [
          "my_mappings_char_filter"
        ]
      }
    },
    "char_filter": {
      "my_mappings_char_filter": {
        "type": "mapping",
        "mappings": [
          ":) => _happy_",
          ":( => _sad_"
        ]
      }
    }
  }
}
}
GET /my-index-000001/_analyze
{
"tokenizer": "keyword",
"char_filter": [ "my_mappings_char_filter" ],
"text": "I'm delighted about it :("
}
[ I'm delighted about it _sad_ ]

pattern_replace character filter
PUT my-index-000001
{
"settings": {
  "analysis": {
    "analyzer": {
      "my_analyzer": {
        "tokenizer": "standard",
        "char_filter": [
          "my_char_filter"
        ]
      }
    },
    "char_filter": {
      "my_char_filter": {
        "type": "pattern_replace",
        "pattern": "(\d+)-(?=\d)",
        "replacement": "_"
      }
    }
  }
}
}

POST my-index-000001/_analyze
{
"analyzer": "my_analyzer",
"text": "My credit card is 123-456-789"
}
[ My, credit, card, is, 123_456_789 ]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存