【Elasticsearch】-配置分词器

参考文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/analysis.html

一、简介

文本分析发生在以下两个时机

索引时 当文档被索引时,任何文本字段值都会被分析。

搜索时 在文本字段上运行全文搜索时,会分析查询字符串

二、索引时设置分词器

在大多数情况下,应在索引和搜索时使用相同的分析器。 这可确保字段的值和查询字符串更改为相同形式的标记。 反过来,这可以确保令牌在搜索期间按预期匹配。

在索引上设置并使用自定义分析器

PUT my-index-000001

{

  "settings": {

    "analysis": {

      "analyzer": {

        "std_folded": { 

          "type": "custom",

          #定义一个名为 std_folded 的自定义分析器。

          "tokenizer": "standard",

          "filter": [

            "lowercase",

            "asciifolding"

          ]

        }

      }

    }

  },

  "mappings": {

    "properties": {

      #字段 my_text 使用 std_folded 分析器。

      "my_text": {

        "type": "text",

        "analyzer": "std_folded" 

      }

    }

  }

}


GET my-index-000001/_analyze 

{

  "analyzer": "std_folded", 

  "text":     "Is this déjà vu?"

}


GET my-index-000001/_analyze 

{

  "field": "my_text", 

  "text":  "Is this déjà vu?"

}

自定义分析器

当内置分析器不能满足您的需求时,您可以创建一个自定义分析器,它使用以下适当组合:

  • 零个或多个字符过滤器
  • 分词器
  • 零个或多个令牌过滤器。

自定义分词器接收以下参数

tokenizer

内置或定制的分词器。

必需

char_filter

可选的内置或自定义字符过滤器数组。

非必需

filter

可选的内置或自定义令牌过滤器数组。

非必需

以下是自定分词器的一个例子

PUT my-index-000001

{

  "settings": {

    "analysis": {

      "analyzer": {

        "my_custom_analyzer": { 

          "type": "custom",

          "char_filter": [

            "emoticons"

          ],

          "tokenizer": "punctuation",

          "filter": [

            "lowercase",

            "english_stop"

          ]

        }

      },

      "tokenizer": {

        "punctuation": { 

          "type": "pattern",

          "pattern": "[ .,!?]"

        }

      },

      "char_filter": {

        "emoticons": { 

          "type": "mapping",

          "mappings": [

            ":) => _happy_",

            ":( => _sad_"

          ]

        }

      },

      "filter": {

        "english_stop": { 

          "type": "stop",

          "stopwords": "_english_"

        }

      }

    }

  }

}


POST my-index-000001/_analyze

{

  "analyzer": "my_custom_analyzer",

  "text": "I'm a :) person, and you?"

}

Elasticsearch 通过依次检查以下参数来确定要使用的索引分析器:

  1. 字段的分析器映射参数。
  2. analysis.analyzer.default 索引设置。
  3. 如果没有指定这些参数,则使用标准分析器。


以下创建索引 API 请求将空白分析器设置为标题字段的分析器。

PUT my-index-000001

{

  "mappings": {

    "properties": {

      "title": {

        "type": "text",

        "analyzer": "whitespace"

      }

    }

  }

}

除了字段级分析器之外,您还可以设置备用分析器以使用 analysis.analyzer.default 设置。

PUT my-index-000001

{

  "settings": {

    "analysis": {

      "analyzer": {

        "default": {

          "type": "simple"

        }

      }

    }

  }

}

二、搜索时设置分词器

在搜索时,Elasticsearch 通过依次检查以下参数来确定要使用的分析器:

  1. 搜索查询中的分析器参数。
  2. 字段的 search_analyzer 映射参数。
  3. analysis.analyzer.default_search 索引设置。
  4. 字段的分析器映射参数。
  5. 如果没有指定这些参数,则使用标准分析器。

编写全文查询时,可以使用 analyzer 参数指定搜索分析器。 如果提供,它将覆盖任何其他搜索分析器。比如以下例子

GET my-index-000001/_search

{

  "query": {

    "match": {

      "message": {

        "query": "Quick foxes",

        "analyzer": "stop"

      }

    }

  }

}

创建索引时设置默认的搜索分析器

# 以下创建索引 API 请求将空白分析器设置为 my-index-000001 索引的默认搜索分析器

PUT my-index-000001

{

  "settings": {

    "analysis": {

      "analyzer": {

        "default": {

          "type": "simple"

        },

        "default_search": {

          "type": "whitespace"

        }

      }

    }

  }

}

上一篇:【chrome插件】web版微信接入图灵机器人API实现自动回复


下一篇:【Elasticsearch】-doc基本操作