Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

news2024/11/17 13:41:44

创建es索引并学习分析器、过滤器、分词器的作用和配置

  • 一、基础概念
    • Elasticsearch与MySQL的类比
    • 1. ES与MySQL的结构类比图
    • 2. ES与MySQL的类比示意表格
    • 3. 索引中重要概念
      • 索引(Index)
      • 文档(Document)
      • 字段(Field)
      • 映射(Mapping)
  • 二、定义索引
    • 索引的组成
    • 索引示例
  • 三、索引分析
  • 四、官方文档(参考)
    • 分析器配置
      • 配置内置分析器(Configuring built-in analyzers)
      • 指定分析器(Specify an analyzer)
    • 内置分析器参考
    • 分词器参考
      • 面向单词的分词器
      • 面向部分单词的分词器
      • 结构化文本分词器
    • 分词过滤器参考(Token filter reference)
    • 字符过滤器参考(Character filters reference)
    • 标准化器(Normalizers)

一、基础概念

Elasticsearch 是一个分布式搜索和分析引擎,它使用JSON文档来存储数据。索引是Elasticsearch中数据的基本组织单元之一,下面是Elasticsearch索引相关的基本概念:

Elasticsearch与MySQL的类比

1. ES与MySQL的结构类比图

在这里插入图片描述

2. ES与MySQL的类比示意表格

结构元素ElasticsearchMySQL
数据库索引(Index)数据库(Database)
表格类型(Type)*表(Table)
记录/行文档(Document)记录(Row)
列/字段字段(Field)列(Column)
主键_id 字段主键(Primary Key)
查询语言Query DSLSQL

注意:在Elasticsearch 7.x版本之后,不再使用类型(Type)的概念,每个索引只包含文档。所以在新版本中,没有类型,只有索引和文档。因此es的索引我们也可以类比为mysql中的数据表

3. 索引中重要概念

索引(Index)

  • 索引是Elasticsearch中的主要数据存储单元。它类似于传统数据库中的表,但更加灵活。
  • 索引用于存储相关文档,这些文档可能属于不同的数据类型,但具有共同的查询需求。
  • 一个索引可以包含许多文档,每个文档都是一个JSON对象。

文档(Document)

  • 文档是索引中的基本数据单元。每个文档都是一个JSON对象,它包含了数据字段和对应的值。
  • 例如,在一个名为"books"的索引中,每个文档可能表示一本书,包含书名、作者、出版日期等字段。

字段(Field)

  • 字段(Field)是文档(Document)中包含数据的单个元素。字段可以包含不同类型的数据,如文本、数字、日期等

映射(Mapping)

  • 映射定义索引中每个字段的数据类型和属性。它告诉Elasticsearch如何解释和处理每个字段的数据。
  • 映射可以自动创建,也可以手动定义以更精确地控制字段的处理。

二、定义索引

在开发中es的index我们可以预先定义好,包括索引的别名(alias)、设置(settings)、映射(mappings)等。如果直接用默认的设置,添加文档时es会自动帮我们创建索引,但默认的不一定符合我们的需求

索引的组成

创建Elasticsearch索引的过程通常包括三个关键部分:别名(Aliases)、设置(Settings)、和映射(Mappings),每个部分的作用如下:

  1. 别名(Aliases)

    • 别名是索引的可选名称,允许您将一个或多个索引关联到一个别名上。
    • 别名用于简化查询和索引维护,可以用于切换索引版本、滚动索引、分离索引等操作。
    • 通过别名可以在不更改查询的情况下轻松切换索引,这对于数据版本管理非常有用
  2. 设置(Settings)

    • 设置包括了索引的配置参数,它们会影响索引的行为和性能。
    • 设置可以包括索引的分片和副本配置、刷新间隔、合并策略、搜索相关配置等。
    • 通过设置可以调整索引以满足特定需求。例如,可以设置分片的数量、副本的数量、自定义分析器等。
  3. 映射(Mappings)

    • 映射定义了索引中每个字段的数据类型和属性。它告诉Elasticsearch如何解释和处理文档中的数据。
    • 可以选择让Elasticsearch自动创建映射(Dynamic Mapping),或者可以显式定义映射以更精确地控制字段的处理(推荐显式定义)。
    • 映射定义通常包括字段名称、数据类型(如文本、整数、日期等)、分析器(用于文本字段的文本分词)等信息。

索引示例

使用Elasticsearch的REST API来创建一个名为"books"的索引 :

PUT /books
{
  "aliases": {
    "cn_book": {}
  },
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "author": {
        "type": "keyword"
      },
      "publish_date": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

以下是每个部分的说明:

aliases(别名)

  • 别名是一个可选项,允许您为索引定义一个或多个别名,以便更容易引用该索引。在示例中,索引被命名为"cn_book",并且有一个空的别名对象。

settings(设置)

  • 在设置部分,您可以配置索引的全局设置。
  • number_of_shards:指定索引分成的主分片数量。在示例中,索引分成了5个主分片。
  • number_of_replicas:指定每个主分片的副本数量。在示例中,每个主分片有2个副本,用于提高数据冗余和可用性。

mappings(映射)

  • 映射定义了索引中的字段及其数据类型和属性。
  • 在示例中,有三个字段定义:
    • title:类型为"text",使用"standard"分析器。这是一个文本字段,通常用于全文搜索。
    • author:类型为"keyword"。这是一个关键字字段,通常用于精确匹配和聚合。
    • publish_date:类型为"date",使用"yyyy-MM-dd"日期格式。这是一个日期字段,用于存储日期信息。

在这里插入图片描述

三、索引分析

{
  "aliases": {
    "data": {},
    "book": {}
  },
  "settings": {
    "index": {
      "refresh_interval": "5s",
      "max_inner_result_window": "10000",
      "max_result_window": "20000",
      "analysis": {
        "analyzer": {
          "pinyin_analyzer": {
            "tokenizer": "my_pinyin"
          }
        },
        "tokenizer": {
          "my_pinyin": {
            "type": "pinyin",
            "keep_separate_first_letter": false,
            "keep_full_pinyin": true,
            "keep_original": true,
            "limit_first_letter_length": 16,
            "lowercase": true,
            "remove_duplicated_term": true
          }
        },
        "char_filter": {
          "pinyin_multi": {
            "type": "mapping",
            "mappings": [
              "重庆 => 从庆"
            ]
          },
          "pinyin_first": {
            "type": "mapping",
            "mappings_path": "pinyin_first.txt"
          },
          "remove_space": {
            "type": "pattern_replace",
            "pattern": "[\\s「」﹝﹞·,。/《》?;‘’、:“”\\|【】\\{\\}\\~\\·\\!\\@\\#\\¥\\%\\……\\&\\*()\\—\\+\\-\\=\\,\\.\\/\\<\\>\\?\\;'\\\\,\"\\|\\[\\]\\{\\}\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\=\\_\\+]*",
            "replacement": ""
          }
        },
        "normalizer": {
          "sort_normalizer": {
            "type": "custom",
            "char_filter": [
              "remove_space",
              "pinyin_multi",
              "pinyin_first"
            ],
            "filter": [
              "cjk_width",
              "asciifolding"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "dynamic": "false"
  }
}

  1. 别名(Aliases):

    • “navy_data”: 这是一个名为"data"的索引别名。
    • “book”: 这是一个名为"book"的索引别名。
  2. 索引设置(Settings):

    • “index”: 这是索引的根配置。
      • “refresh_interval”: 索引的刷新间隔设置为"5s",表示每5秒进行一次刷新。
      • “max_inner_result_window”: 设置内部结果窗口的最大大小为"10000"。
      • “max_result_window”: 设置结果窗口的最大大小为"20000"。
      • “analysis”: 这是索引的文本分析配置。
        • “analyzer”: 文本分析器的配置。
          • “pinyin_analyzer”: 这是一个名为"pinyin_analyzer"的分析器。
            • “tokenizer”: 指定了使用的分词器,这里使用了名为"my_pinyin"的自定义分词器。
        • “tokenizer”: 自定义分词器的配置。
          • “my_pinyin”: 这是一个名为"my_pinyin"的分词器,类型为"pinyin"。
            • “keep_separate_first_letter”: 设置为"false",表示不保留拼音的首字母。
            • “keep_full_pinyin”: 设置为"true",表示保留完整拼音。
            • “keep_original”: 设置为"true",表示保留原始文本。
            • “limit_first_letter_length”: 设置首字母的长度限制为"16"。
            • “lowercase”: 设置为"true",表示将拼音转换为小写。
            • “remove_duplicated_term”: 设置为"true",表示删除重复的词项。
        • “char_filter”: 字符过滤器的配置。
          • “pinyin_multi”: 这是一个名为"pinyin_multi"的字符过滤器,类型为"mapping",用于将特定字符映射为其他字符。
          • “pinyin_first”: 这是一个名为"pinyin_first"的字符过滤器,类型为"mapping",使用了外部文件"pinyin_first.txt"中的映射。
          • “remove_space”: 这是一个名为"remove_space"的字符过滤器,类型为"pattern_replace",用于移除指定的空格和标点符号。
            • “pattern”: 指定了匹配的正则表达式模式。
            • “replacement”: 指定了替换的字符。
        • “normalizer”: 规范化器的配置。
          • “sort_normalizer”: 这是一个名为"sort_normalizer"的自定义规范化器。
            • “char_filter”: 包括了字符过滤器,包括"remove_space"、“pinyin_multi"和"pinyin_first”。
            • “filter”: 包括了过滤器,包括"cjk_width"和"asciifolding"。
  3. 映射(Mappings):

    • “dynamic”: 设置为"false",表示禁用动态映射,索引中的字段需要明确定义,不允许自动添加新字段。

四、官方文档(参考)

分析器配置

参考:Configure text analysis

  • 默认情况下,Elasticsearch对所有文本分析使用标准分析器。标准分析器为大多数自然语言和用例提供开箱即用的支持。如果选择使用标准分析器,通常不需要进一步的配置。

  • 如果标准分析器不满足您的需求,请查看和测试Elasticsearch的其他内置分析器。内置分析器不需要配置,但某些支持选项可用于调整其行为。例如,您可以配置标准分析器,以去除自定义停用词的列表。

  • 如果没有内置分析器满足您的需求,您可以测试并创建自定义分析器。自定义分析器涉及选择和组合不同的分析器组件,从而提供更大的控制权。
    分析器测试(Test an analyzer)
    analyzer API 用于查看由分析器生成的术语。内置分析器可以在请求中内联指定:

    POST _analyze
    {
      "analyzer": "whitespace",
      "text":     "今天 是 周五"
    }
    

    执行结果

    {
      "tokens" : [
        {
          "token" : "今天",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 3,
          "end_offset" : 4,
          "type" : "word",
          "position" : 1
        },
        {
          "token" : "周五",
          "start_offset" : 5,
          "end_offset" : 7,
          "type" : "word",
          "position" : 2
        }
      ]
    }
    

    还可以测试以下组合:

    ● A tokenizer 分词器
    ● Zero or more token filters 零个或多个分词过滤器
    ● Zero or more character filters 零个或多个字符过滤器

    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" 
          }
        }
      }
    }
    
    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?"
    }
    

配置内置分析器(Configuring built-in analyzers)

内置分析器无需任何配置即可直接使用。 然而,其中一些支持配置选项来改变其行为。例如,标准分析器可以配置为支持停用词列表:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_english": { 
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type":     "text",
        "analyzer": "standard", 
        "fields": {
          "english": {
            "type":     "text",
            "analyzer": "std_english" 
          }
        }
      }
    }
  }
}



POST my-index-000001/_analyze
{
  "field": "my_text", 
  "text": "The old brown cow"
}

POST my-index-000001/_analyze
{
  "field": "my_text.english", 
  "text": "The old brown cow"
}

指定分析器(Specify an analyzer)

Elasticsearch提供了多种指定内置或自定义分析器的方法:

  1. 通过文本字段、索引或查询
  2. 用于索引或搜索时
  • 在需要时,可以在不同级别和不同时间指定分析器,这是灵活性的体现。
  • 在大多数情况下,采用简单的方法最有效:为每个文本字段指定一个分析器,如在“为字段指定分析器”中所述。
  • 这种方法与Elasticsearch的默认行为很好地配合,让您可以在索引和搜索时使用相同的分析器。它还让您能够通过使用"get mapping" API快速查看哪个分析器适用于哪个字段。
  • 如果您通常不为索引创建映射,您可以使用索引模板来实现类似的效果。

Elasticsearch如何确定索引分析器:
Elasticsearch通过按以下顺序检查以下参数来确定要使用的索引分析器:

  1. 字段的分析器映射参数。请参阅“为字段指定分析器”。
  2. analysis.analyzer.default索引设置。请参阅“为索引指定默认分析器”。
  3. 如果没有指定上述参数,则使用标准分析器。

为字段指定分析器:
在映射索引时,您可以使用分析器映射参数为每个文本字段指定一个分析器。以下是一个创建索引的API请求示例,将空格分析器设置为标题字段的分析器:

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

为索引指定默认分析器:
除了字段级分析器,您还可以使用analysis.analyzer.default设置为索引设置一个备用分析器。以下是一个创建索引的API请求示例,将简单分析器设置为my-index-000001的备用分析器:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}

Elasticsearch如何确定搜索分析器:
在大多数情况下,指定不同的搜索分析器是不必要的。这样做可能会对相关性产生负面影响,导致意外的搜索结果。

如果选择指定单独的搜索分析器,我们建议在部署到生产环境之前进行彻底的分析配置测试。

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

  1. 查询中的analyzer参数。请参阅“为查询指定搜索分析器”。
  2. 字段的search_analyzer映射参数。请参阅“为字段指定搜索分析器”。
  3. analysis.analyzer.default_search索引设置。请参阅“为索引指定默认搜索分析器”。
  4. 字段的分析器映射参数。请参阅“为字段指定分析器”。
  5. 如果没有指定上述参数,则使用标准分析器

为查询指定搜索分析器:
在编写全文查询时,您可以使用analyzer参数来指定搜索分析器。如果提供了此参数,它将覆盖任何其他搜索分析器。以下是一个示例,为匹配查询设置了停用词分析器作为搜索分析器:

GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}

为字段指定搜索分析器:
在映射索引时,您可以使用search_analyzer映射参数为每个文本字段指定搜索分析器。如果提供了搜索分析器,则必须还使用analyzer参数指定索引分析器。以下是一个创建索引的API请求示例,将简单分析器设置为标题字段的搜索分析器:

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

为索引指定默认搜索分析器:
在创建索引时,您可以使用analysis.analyzer.default_search设置为索引设置一个默认搜索分析器。如果提供了搜索分析器,则必须使用analysis.analyzer.default设置指定默认索引分析器。以下是一个创建索引的API请求示例,将空格分析器设置为my-index-000001的默认搜索分析器:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}

这些设置和指定分析器的方式可根据您的需求和索引映射的复杂程度进行调整。根据具体的需求,您可以选择使用简单或复杂的分析配置。

内置分析器参考

官网参考:Built-in analyzer reference

Elasticsearch内置了各种分析器,可以在不需要进一步配置的情况下用于任何索引:

  1. 标准分析器(Standard Analyzer)

    • 标准分析器根据Unicode文本分割算法在单词边界将文本划分为项(terms)。
    • 它移除大多数标点符号、将项转换为小写,并支持移除停用词。
  2. 简单分析器(Simple Analyzer)

    • 简单分析器在遇到非字母字符时将文本划分为项。
    • 它将所有项转换为小写。
  3. 空格分析器(Whitespace Analyzer)

    • 空格分析器在遇到任何空格字符时将文本划分为项。
    • 它不将项转换为小写。
  4. 停用词分析器(Stop Analyzer)

    • 停用词分析器类似于简单分析器,但还支持停用词的移除。
  5. 关键字分析器(Keyword Analyzer)

    • 关键字分析器是一个“无操作”分析器,接受任何文本并输出与原始文本相同的单个项。
  6. 模式分析器(Pattern Analyzer)

    • 模式分析器使用正则表达式将文本划分为项。
    • 它支持小写处理和停用词的移除。
  7. 语言分析器(Language Analyzers)

    • Elasticsearch提供了许多语言特定的分析器,如英语或法语。
  8. 指纹分析器(Fingerprint Analyzer)

    • 指纹分析器是一个专门的分析器,用于创建用于重复检测的指纹。
  9. 自定义分析器(Custom Analyzers)

    • 如果找不到适合您需求的分析器,您可以创建一个自定义分析器,结合适当的字符过滤器、标记器和标记过滤器。

分词器参考

一个分词器接收一系列字符流,将其分解成单独的分词(通常是单个单词),并输出一系列分词。例如,一个空格分词器会在看到任何空格时将文本分成分词。它会将文本 “Quick brown fox!” 转换为词项 [Quick, brown, fox!]。

分词器还负责记录以下信息:

●每个词项的顺序或位置(用于短语和单词接近查询)。
●每个词项表示的原始单词的起始和结束字符偏移量(用于突出显示搜索片段)。
●分词类型,对生成的每个词项进行分类,如 、 或 。更简单的分析器只生成单词分词类型。

Elasticsearch内置了许多分词器,可以用于构建自定义分析器。

面向单词的分词器

以下的分词器通常用于将全文分词成单独的单词:

  1. 标准分词器(Standard Tokenizer)

    • 标准分词器根据Unicode文本分割算法在单词边界将文本划分为词项。
    • 它移除大多数标点符号。对于大多数语言来说,这是最佳选择
  2. 字母分词器(Letter Tokenizer)

    • 字母分词器在遇到非字母字符时将文本划分为词项。
  3. 小写分词器(Lowercase Tokenizer)

    • 小写分词器,类似于字母分词器,在遇到非字母字符时将文本划分为词项,但还将所有词项转换为小写。
  4. 空格分词器(Whitespace Tokenizer)

    • 空格分词器在遇到任何空格字符时将文本划分为词项。
  5. UAX URL Email 分词器(UAX URL Email Tokenizer)

    • uax_url_email 分词器类似于标准分词器,不过它识别URL和电子邮件地址作为单个词项。
  6. 经典分词器(Classic Tokenizer)

    • 经典分词器是一种基于语法的英语语言分词器。
  7. 泰语分词器(Thai Tokenizer)

    • 泰语分词器将泰文文本分割成单词。

面向部分单词的分词器

这些分词器将文本或单词分割成小片段,用于部分单词匹配:

  1. N-Gram 分词器(N-Gram Tokenizer)

    • ngram 分词器可以在遇到指定字符列表之一(例如空格或标点符号)时将文本分解为词项,然后返回每个词项的n-gram(连续字母的滑动窗口),例如 quick → [qu, ui, ic, ck]。
  2. 边缘 N-Gram 分词器(Edge N-Gram Tokenizer)

    • 边缘 ngram 分词器可以在遇到指定字符列表之一(例如空格或标点符号)时将文本分解为词项,然后返回每个词项的n-gram,这些n-gram锚定在单词的开头,例如 quick → [q, qu, qui, quic, quick]。

结构化文本分词器

以下的分词器通常用于结构化文本,如标识符、电子邮件地址、邮政编码和路径,而不是用于全文:

  1. 关键字分词器(Keyword Tokenizer)

    • 关键字分词器是一个“无操作”分词器,接受任何文本并输出与原始文本相同的单个词项。它可以与分词过滤器(如小写化)结合使用以规范分析后的词项。
  2. 模式分词器(Pattern Tokenizer)

    • 模式分词器使用正则表达式,可以在匹配单词分隔符时将文本分解为词项,或捕获匹配的文本作为词项。
  3. 简单模式分词器(Simple Pattern Tokenizer)

    • 简单模式分词器使用正则表达式捕获匹配的文本作为词项。它使用正则表达式功能的有限子集,通常比模式分词器更快。
  4. 字符组分词器(Char Group Tokenizer)

    • 字符组分词器可通过一组要分割的字符进行配置,通常比运行正则表达式更经济。
  5. 简单模式拆分分词器(Simple Pattern Split Tokenizer)

    • 简单模式拆分分词器使用与简单模式分词器相同的有限正则表达式子集,但在匹配时分割输入,而不是将匹配作为词项返回。
  6. 路径分词器(Path Tokenizer)

    • path_hierarchy 分词器接受分层值,如文件系统路径,按路径分隔符拆分,并为树中的每个组件发出一个词

分词过滤器参考(Token filter reference)

官网参考:Token filter reference

分词过滤器(Token filters)接受来自分词器的分词流(tokens),可以修改分词(例如小写化)、删除分词(例如去除停用词)或添加分词(例如同义词)。Elasticsearch提供了多个内置的分词过滤器,可以用它们来构建自定义分析器。

  • Apostrophetokenfilter
  • ASCIIfoldingtokenfilter
  • CJKbigramtokenfilter
  • CJKwidthtokenfilter
  • Classictokenfilter
  • Commongramstokenfilter
  • Conditionaltokenfilter
  • Decimaldigittokenfilter
  • Delimitedpayloadtokenfilter
  • Dictionarydecompoundertokenfilter
  • Edgen-gramtokenfilter
  • Elisiontokenfilter
  • Fingerprinttokenfilter
  • Flattengraphtokenfilter
  • Hunspelltokenfilter
  • Hyphenationdecompoundertokenfilter
  • Keeptypestokenfilter
  • Keepwordstokenfilter
  • Keywordmarkertokenfilter
  • Keywordrepeattokenfilter
  • KStemtokenfilter
  • Lengthtokenfilter
  • Limittokencounttokenfilter
  • Lowercasetokenfilter
  • MinHashtokenfilter
  • Multiplexertokenfilter
  • N-gramtokenfilter
  • Normalizationtokenfilters
  • Patterncapturetokenfilter
  • Patternreplacetokenfilter
  • Phonetictokenfilter
  • Porterstemtokenfilter
  • Predicatescripttokenfilter
  • Removeduplicatestokenfilter
  • Reversetokenfilter
  • Shingletokenfilter
  • Snowballtokenfilter
  • Stemmertokenfilter
  • Stemmeroverridetokenfilter
  • Stoptokenfilter
  • Synonymtokenfilter
  • Synonymgraphtokenfilter
  • Trimtokenfilter
  • Truncatetokenfilter
  • Uniquetokenfilter
  • Uppercasetokenfilter
  • Worddelimitertokenfilter
  • Worddelimitergraphtokenfilter

字符过滤器参考(Character filters reference)

官网参考:Character filters reference

  • 字符过滤器(Character filters)用于在字符流传递给分词器之前对其进行预处理。

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

Elasticsearch 提供了多个内置的字符过滤器,可以用它们来构建自定义分析器。

  • HTML 剥离字符过滤器(HTML Strip Character Filter):剥离 HTML 元素,如 ,并解码 HTML 实体,如 &。
  • 映射字符过滤器(Mapping Character Filter):替换指定字符串的任何出现次数为指定的替代字符串。
  • 模式替换字符过滤器(Pattern Replace Character Filter):使用指定的替代字符串替换与正则表达式匹配的任何字符。

标准化器(Normalizers)

规范化器与分析器类似,不同之处在于它们只能发出单个令牌。因此,它们没有标记化器,只接受可用的字符过滤器和标记过滤器的子集。只允许使用按字符工作的筛选器。例如,允许使用小写过滤器,但不允许使用词干过滤器,因为词干过滤器需要将关键字作为一个整体来查看。可在规范化器中使用的过滤器的当前列表如下:阿拉伯规范化、asciifolding、bengali_normalization、cjk_width、decimal_digh、elision、german_normalization、hindi_normalizing、indic_normalization、小写、persian_normalizion、scandinavian_folding、serbian_normalized、sorani_normalize、大写。Elasticsearch附带了一个小写的内置规范器。对于其他形式的规范化,需要自定义配置。
以下是一个示例,演示如何创建一个自定义规范化器:

PUT index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "quote": {
          "type": "mapping",
          "mappings": [
            "« => \"",
            "» => \""
          ]
        }
      },
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": ["quote"],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "foo": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

在上述示例中,我们创建了一个名为my_normalizer的自定义规范化器,使用了字符过滤器quote和过滤器lowercaseasciifolding。然后,我们将这个规范化器应用于索引中的foo字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

值类型引用类型区别

例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Demo2 {internal class Program{static void Main(string[] args){#region 值类型int a 1;int b a;b 2;Console.WriteLine("a&…

【微信小程序调试工具试用】

【微信小程序调试工具试用】 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09;本次工具分享到此结束 什么是爬虫逆向&#xff1f; 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09; 1 如图 下面小程序…

c语言练习92:链表的中间结点

链表的中间结点 链表的结点为空时无法访问其next成员否则会报错 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* middleNode(struct ListNode* head){if(h…

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows10下使用【Instant Neural Surface Reconstruction】算法时需要…

PositiveSSL的泛域名SSL证书

PositiveSSL是Sectigo旗下的一个子品牌&#xff0c;致力于为全球用户提供优质、高效的SSL证书服务。PositiveSSL以Sectigo强大的品牌影响力和全球网络为基础&#xff0c;秉承“安全、可靠、高效”的服务理念&#xff0c;为各类网站提供全面的SSL证书解决方案。今天就随SSL盾小编…

苹果官网上架新款Apple Pencil(USB-C)

昨天晚上苹果在其官网发布了新款Apple Pencil手写笔&#xff0c;苹果将该产品命名为 Apple Pencil&#xff08;USB-C&#xff09;&#xff0c;新款Apple Pencil采用了全新的USB-C接口&#xff0c;支持USB-C充电&#xff0c;兼容所有配备USB-C接口的iPad机型&#xff0c;售价为6…

Windows中安装tree命令

1、tree命令下载 下载地址&#xff1a;http://gnuwin32.sourceforge.net/packages/tree.htm&#xff1b; 2、tree命令安装 将tree命令添加到环境变量PATH中指定的路径下&#xff0c;可参考博客&#xff1a;《Windows中安装GCC详细教程》&#xff1b;

Android SurfaceControlViewHost介绍及使用

概要介绍 SurfaceControlViewHost是一个工具类&#xff0c; 用于帮助在其他进程中显示本进程的view。 SurfaceControlViewHost 为绘制进程持有&#xff0c;其中的SurfacePackage 交给另外的显示进程&#xff0c;在显示进程中的SurfaceView中通过SurfaceView.setChildSurface…

近期的数据显示 前三季度券商罚单近150张,哪些手段才能确保业务的合规性和稳健性?

近期的数据显示&#xff0c;券商行业在前三季度面临了持续的监管压力&#xff0c;共计收到近150张罚单。其中&#xff0c;中信证券以11张罚单成为年初至今领罚最多的券商&#xff0c;而方正证券、国融证券、光大证券等4家券商罚单数量也高达8张。而更令人担忧的是&#xff0c;已…

前端已死!转行网络安全,挖漏洞真香!

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬畏…

小红书数据分析:十天涨粉百万,“于文亮”带动自由风成内容密码

导语 这两天&#xff0c;某音视频博主于文亮火了&#xff0c;仅仅十天&#xff0c;粉丝数就突破了百万大关&#xff0c;而且这个数字还在以每小时一万的速度飙升。点开他的主页&#xff0c;会发现他只是一个其貌不扬的在校生&#xff0c;上传的也都是些稀疏平常的生活场景。 图…

CAD三维多孔结构插件 数字岩心 多孔介质 基于随机生长四参数

插件介绍 CAD多孔结构3D QSGS插件可用于在AutoCAD软件内生成三维多孔结构模型&#xff0c;可用于数字岩心、多孔介质、多孔结构等方面的建模及模拟。 插件可指定模型的长度、宽度、高度&#xff0c;可构建任意几何尺寸三维几何模型。 多孔结构建模基于四参数随机生长&#x…

【JUC】读写锁

读写锁 文章目录 读写锁1. ReentrantReadWriteLock概述2. 编码演示2.1 ReentrantLock实现2.2 ReentrantReadWriteLock实现 3. ReentrantReadWriteLock3.1 锁降级3.2 锁降级的必要性3.3 饥饿问题 4. StampedLock&#xff08;邮戳锁也叫票据锁&#xff09;4.1 特点4.2 三种访问模…

微信如何自动添加好友?多账号如何统一自动加好友?

有朋友因为工作需要&#xff0c;要将一批名单加到微信好友中&#xff08;已知手机号&#xff09;。目前的方法是通过QQ同步助手&#xff0c;把电脑上的名单同步到手机上&#xff0c;然后再由微信自带的通讯录好友推荐来发起好友申请。 但是&#xff0c;这个做法的问题是&#…

《视觉 SLAM 十四讲》V2 第 12 讲 建图

文章目录 12.2 单目稠密 重建12.2.2 极线搜索 && 块匹配12.2.3 高斯分布的深度滤波器 12.3 单目稠密重建 【Code】待改进12.3.4 图像间的变换 12.4 RGB-D 稠密建图12.4.1 点云地图 【Code】查询OpenCV版本 opencv_version 12.4.2 从点云 重建 网格 【Code】查看PCL 版本…

three-tile: 三维瓦片地图框架应用示例源码-GitHub

上篇文章&#xff1a;three-tile: 从头编写一套三维瓦片地图框架&#xff0c;大家是否有兴趣&#xff1f; three-tile&#xff0c;一个基于threejs的三维瓦片地图框架。最近花了点时间写了一些应用示例&#xff0c;放在GitHub上了&#xff0c;其中包含three-tile框架打包后的代…

第二证券:A股三季报披露全面启动 多领域上市公司业绩表现亮点纷呈

A股上市公司三季报宣告全面发动。Wind数据闪现&#xff0c;到10月17日记者发稿&#xff0c;来自沪深北三大交易所近80家上市公司首要晒出了最新运营效果体现的“效果单”。本周&#xff0c;相关财报宣告家数也将增至270家左右。与此同时&#xff0c;10月以来&#xff0c;亦有不…

移远通信携手MIKROE推出搭载LC29H系列模组的Click boards开发板,为物联网应用带来高精定位服务

近日&#xff0c;移远通信与MikroElektronika&#xff08;以下简称“MIKROE”&#xff09;展开合作&#xff0c;基于移远LC29H系列模组推出了多款支持实时动态载波相位差分技术&#xff08;RTK&#xff09;和惯性导航&#xff08;DR&#xff09;技术的Click Boards™ 开发板&am…

sql中的group by 举例子数据库日期带汉字转换2023年10月18天

sql中的group by 举例子 sql中 group by多个字段&#xff0c;对所有字段做group by_group by 多个字段_Foools的博客-CSDN博客 【精选】玩转SQL语句之group by 多字段分组查询与having子句&#xff0c;一篇解决你的疑惑&#xff01;_sql多个分组查询-CSDN博客 select to_char…