Elasticsearch 自定义分析器 analyzer API 查看文本内容如何被分析

声明:本博客根据《ES权威指南》内容总结整理而成,转载请注明出处:https://blog.csdn.net/qingmou_csdn

 

Elasticsearch内置了一系列分析器,但是ES支持自定义分析器。

通过在配置文件中组合字符过滤器,分词器和表征过滤器可以满足特定数据的要求。

分析器是三个顺序执行的组件的结合(字符过滤器、分词器、表征过滤器)

 

  • 字符过滤器(char_filter):

让字符串在被分词前变得更加“整洁”。

如,html_strip 字符过滤器可删除所有的HTML标签诸如

,并可将HTML实体转换成对应的Unicode字符,如将 Á 转成 A 。

 

  • 分词器(filter):

将字符串分割成单独的词(terms)或表征(tokens)。如:

standard分词器将字符串分割成单独的字词,删除大部分标点符号;

keyword分词器输出和它接收到的相同的字符串,不做任何分词处理;

whitespace分词器只通过空格来分割文本;

pattern分词器可通过正则表达式分割文本。

 

  • 表征过滤器(analyzer):

分词结果的表征流根据各自情况传递给特定表征过滤器。

表征过滤器可能修改,添加或删除表征。如:

lowercase表征过滤器将大写转换为小写;

stop表征过滤器删除特定表征;

stemmer表征过滤器将单词转化为它们的根形态(root form);

ascii_folding表征过滤器删除变音符合(如从 très 转为 tres );

ngram和edge_ngram可让表征更适合特殊匹配情况或自动完成。

 

创建自定义分析器 my_analyzer :

在 analysis 字段下配置字符过滤器、分词器和表征过滤器:

PUT /my_index
{
   "settings":{
     "analysis":{
       "char_filter":{ ... custom character filters ... },
       "tokenizer":{ ... custom tokenizers ... },
       "filter":{ ... custom token  filter ... },
       "analyzer":{ ... custom analyzers ... }
     }
  }
}

我们将配置一个这样的分析器:

1.用 html_strip 字符过滤器去除所有的 HTML 标签;

2.将 & 替换成 and ,将 # 替换成 four ,使用一个自定义的 mapping 字符过滤器;

3.使用 standard 分词器分割单词;

4.使用 lowercase 表征过滤器将词转为小写;

5.用 stop 表征过滤器去除自定义停用词。

DELETE es_analyzer_test

PUT es_analyzer_test
{
  "settings": {
    "analysis": {
      "char_filter": {
        "char_filter_test":{
          "type":"mapping",
          "mappings":["&=>and","#=>four"]
        }
      },
      "filter": {
        "my_stopwords":{
          "type":"stop",
          "stopwords":["the","a","and","stop"]
        }
      },
      "analyzer": {
        "my_analyzer":{
          "type":"custom",
          "char_filter":["html_strip","char_filter_test"],
          "tokenizer":"standard",
          "filter":["lowercase","my_stopwords"]
        }
      }
    }
  }
}

测试分词器是否达到预期目标:

GET es_analyzer_test/_analyze
{
  "text": ["HELLO & # the a stop world"],
  "analyzer": "my_analyzer"
}

相应结果如下:

{
  "tokens": [
    {
      "token": "hello",
      "start_offset": 0,
      "end_offset": 5,
      "type": "",
      "position": 0
    },
    {
      "token": "four",
      "start_offset": 8,
      "end_offset": 9,
      "type": "",
      "position": 2
    },
    {
      "token": "world",
      "start_offset": 21,
      "end_offset": 26,
      "type": "",
      "position": 6
    }
  ]
}

 达成我们预期目标。

 

 

你可能感兴趣的:(ElasticSearch)