ElasticSearch自定义分析器(custom analyzer)

基于elasticsearch7.6.1 和 kibana7.6.1

一、基础知识

一个完整的分析器Analyzer包括如下三个组件:

  1. Character Filters: 对文本信息就行预处理,比如对原始文本删减或替换字符
  2. Token Filters: 分词后过滤,对分词后的词语列表进行处理(过滤,删除等)
  3. Tokenizer:分词器,即将原始文本按照一定规则切分为词语(token)

1. Character Filters

es内置的Character Filters包括:html_strip: 去除html标签, mapping:字符串替换|映射, pattern_replace: 正则匹配替换。

案例演示

# char_filter: "html_strip"去除 html 标签

POST _analyze
{
  "char_filter": [
    "html_strip"
  ],
  "tokenizer": "standard",
  "text": "<html><body><div><span>You Know, for Search<span></div><body><html>"
}

# char_filter: "mapping"字符串替换|映射

POST _analyze
{
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "&=>and",
        "&&=>and"
      ]
    }
  ],
  "tokenizer": "standard",
  "text": "You & me, go && java"
}

 # char_filter: "pattern_replace"正则匹配替换

POST _analyze
{
  "char_filter": [
    {
      "type": "pattern_replace",
      "pattern": "(v[0-9.]+)",
      "replacement": "latest version"
    }
  ], 
  "tokenizer": "standard",
  "text": "kibana v7.6.1 and elasticsearch v7.6.1"
}

# char_filter: 多个组合使用

POST _analyze
{
  "char_filter": [
    "html_strip",
    {
      "type": "mapping",
      "mappings": [
        "&=>and",
        "&&=>and"
      ]
    },
    {
      "type": "pattern_replace",
      "pattern": "(v[0-9.]+)",
      "replacement": "latest version"
    }
  ],
  "tokenizer": "standard",
  "text": "<html><body><div><span>kibana v7.6.1 && elasticsearch v7.6.1<span></div><body><html>"

2. Token Filters

Token Filters对Tokenizer分词后的结果进行再加工,包括字符处理,过滤,删除等操作,es内置的Token Filters包括: lowercase(转小写), stop(删除停止词), synonym(添加同义词)。

案例演示

# filter: "stop"

# 默认停用词列表全是小写词语,单词'A'虽然是停用词,但因为是大写的,单独使用stop这个token filter无法将其过滤掉。

POST _analyze
{
  "tokenizer": "standard",
  "filter": [
    "stop"
  ],
  "text": "A man sat alone on a stone bench"
}

# filter: "stop" and "lowercase"

# 注意两者的作用顺序

POST _analyze
{
  "tokenizer": "standard",
  "filter": [
    "lowercase",
    "stop"
  ],
  "text": "A man sat alone on a stone bench"
}

二、在索引中自定义分析器Analyzer

案例演示

案例01

# 通过组合character filter, tokernizer, token filter来实现自定义的分析器

# standard_custom: 是自定义分析器的名称

PUT movies
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 1,
    "analysis": {
      "analyzer": {
        "standard_custom": {
          "type": "custom",
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "stop"
          ]
        }
      }
    }
  }

# 使用自定义的分析器和标准分析器(注意观察两者结果的区别)

GET movies/_analyze
{
  "analyzer": "standard_custom",
  "text": "<html><body><div><span>A man sat alone on a stone bench<span></div><body><html>"
}


GET movies/_analyze
{
  "analyzer": "standard",
  "text": "<html><body><div><span>A man sat alone on a stone bench<span></div><body><html>"
}

案例02

PUT songs
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 1,
    "analysis": {
      "char_filter": {
        "CF1": {
          "type": "pattern_replace",
          "pattern": "(v[0-9.]+)",
          "replacement": "latest version"
        },
        "CF2": {
          "type": "mapping",
          "mappings": [
            "&=>and",
            "&&=>and"
          ]
        }
      },
      "analyzer": {
        "standard_custom": {
          "type": "custom",
          "char_filter": [
            "html_strip",
            "CF1",
            "CF2"
          ],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "stop"
          ]
        }
      }
    }
  }

# 使用自定义的分析器

GET songs/_analyze
{
  "analyzer": "standard_custom",
  "text": "<html><body><div><span>A man sat alone on a stone bench & kibana v7.6.1 && elasticsearch v7.6.1<span></div><body><html>"

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Elasticsearch 中,禁用不必要的分析器可以通过以下两种方式实现: 1. 在索引映射中指定字段的分析器为 "keyword" 或 "whitespace",这将禁用分析器并将字段视为一个整体进行索引和搜索。 示例映射: ``` { "mappings": { "properties": { "title": { "type": "text", "analyzer": "keyword" }, "description": { "type": "text", "analyzer": "whitespace" } } } } ``` 2. 在查询中使用 "term" 或 "match_phrase" 查询,这将禁用查询字符串的分析器,并将查询字符串视为一个整体进行搜索。 示例查询: ``` { "query": { "term": { "title": "Elasticsearch" } } } ``` ### 回答2: 在 Elasticsearch 中,禁用不必要的分析器是为了提高搜索性能和减少资源占用。以下是一些禁用不必要分析器的方法: 1. 禁用默认分析器Elasticsearch 会默认使用一个名为"standard"的分析器,可以通过指定一个空的分析器来禁用它。例如,在创建索引时,可以将字段的分析器设置为空字符串: ``` PUT /my_index { "settings": { "analysis": { "analyzer": { "default": { "type": "custom", "tokenizer": "standard", "filter": [] } } } }, "mappings": { "properties": { "my_text_field": { "type": "text", "analyzer": "" } } } } ``` 2. 禁用特定分析器:如果你只想禁用特定分析器而不是默认分析器,可以使用空字符串或指定一个无效的分析器名称。例如: ``` PUT /my_index/_settings { "analysis": { "analyzer": { "my_analyzer": "none" } } } ``` 3. 禁用搜索时的分析器:在进行搜索时,默认情况下 Elasticsearch 会使用相同的分析器对搜索查询进行分词。如果你的查询涉及到一个不需要分词的字段,你可以使用`match_phrase`等查询类型来禁用搜索时的分析器。例如: ``` GET /my_index/_search { "query": { "match_phrase": { "my_non_analyzed_field": { "query": "Some text", "analyzer": "keyword" } } } } ``` 通过以上方法,可以禁用不必要的分析器,从而提高 Elasticsearch 的搜索性能和减少资源占用。 ### 回答3: 在Elasticsearch中,我们可以通过禁用不必要的分析器来优化索引和搜索性能。 首先,分析器在索引和搜索过程中负责将文本转换为标记(tokens),并执行各种文本处理任务,例如分词、小写转换、去除停用词等。但是,并不是所有的字段都需要进行分析,尤其是那些已经是标记化或已经处理好的字段。 要禁用不必要的分析器,我们可以通过定义一个自定义分析器并将其配置为"standard"分析器的别名来实现。例如,如果我们有一个名为"raw"的字段,它已经是标记化或已经进行了所需的文本处理,我们可以将其配置为别名为"keyword"的"standard"分析器。配置示例如下: PUT my_index { "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase"] } } } }, "mappings": { "properties": { "raw": { "type": "text", "analyzer": "my_custom_analyzer", "search_analyzer": "keyword" } } } } 在上面的示例中,我们使用了自定义分析器"my_custom_analyzer",它只包含了一个"standard"分词器和一个"lowercase"过滤器。然后,我们将"raw"字段映射为"text"类型,并将其指定为"my_custom_analyzer"分析器,同时将搜索分析器设置为"keyword",这样就禁用了不必要的分析器。 通过禁用不必要的分析器,我们可以减少不必要的计算和内存开销,提高Elasticsearch的索引和搜索性能,并节省存储空间。但是需要注意的是,禁用分析器可能会影响搜索的精确性和效果,因此在禁用之前应先评估其对搜索结果的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值