站酷网怎么样,建什么网站收益比较号,wordpress cdc,做网站需要注册的那种创建es索引并学习分析器、过滤器、分词器的作用和配置 一、基础概念Elasticsearch与MySQL的类比1. ES与MySQL的结构类比图2. ES与MySQL的类比示意表格3. 索引中重要概念索引#xff08;Index#xff09;文档#xff08;Document#xff09;字段#xff08;Field#xff0… 创建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每个部分的作用如下 别名Aliases 别名是索引的可选名称允许您将一个或多个索引关联到一个别名上。别名用于简化查询和索引维护可以用于切换索引版本、滚动索引、分离索引等操作。通过别名可以在不更改查询的情况下轻松切换索引这对于数据版本管理非常有用 设置Settings 设置包括了索引的配置参数它们会影响索引的行为和性能。设置可以包括索引的分片和副本配置、刷新间隔、合并策略、搜索相关配置等。通过设置可以调整索引以满足特定需求。例如可以设置分片的数量、副本的数量、自定义分析器等。 映射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}
} 别名Aliases: “navy_data”: 这是一个名为data的索引别名。“book”: 这是一个名为book的索引别名。 索引设置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。 映射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提供了多种指定内置或自定义分析器的方法
通过文本字段、索引或查询用于索引或搜索时
在需要时可以在不同级别和不同时间指定分析器这是灵活性的体现。在大多数情况下采用简单的方法最有效为每个文本字段指定一个分析器如在“为字段指定分析器”中所述。这种方法与Elasticsearch的默认行为很好地配合让您可以在索引和搜索时使用相同的分析器。它还让您能够通过使用get mapping API快速查看哪个分析器适用于哪个字段。如果您通常不为索引创建映射您可以使用索引模板来实现类似的效果。
Elasticsearch如何确定索引分析器 Elasticsearch通过按以下顺序检查以下参数来确定要使用的索引分析器
字段的分析器映射参数。请参阅“为字段指定分析器”。analysis.analyzer.default索引设置。请参阅“为索引指定默认分析器”。如果没有指定上述参数则使用标准分析器。
为字段指定分析器 在映射索引时您可以使用分析器映射参数为每个文本字段指定一个分析器。以下是一个创建索引的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通过按以下顺序检查以下参数来确定要使用的分析器
查询中的analyzer参数。请参阅“为查询指定搜索分析器”。字段的search_analyzer映射参数。请参阅“为字段指定搜索分析器”。analysis.analyzer.default_search索引设置。请参阅“为索引指定默认搜索分析器”。字段的分析器映射参数。请参阅“为字段指定分析器”。如果没有指定上述参数则使用标准分析器。
为查询指定搜索分析器 在编写全文查询时您可以使用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内置了各种分析器可以在不需要进一步配置的情况下用于任何索引 标准分析器Standard Analyzer 标准分析器根据Unicode文本分割算法在单词边界将文本划分为项terms。它移除大多数标点符号、将项转换为小写并支持移除停用词。 简单分析器Simple Analyzer 简单分析器在遇到非字母字符时将文本划分为项。它将所有项转换为小写。 空格分析器Whitespace Analyzer 空格分析器在遇到任何空格字符时将文本划分为项。它不将项转换为小写。 停用词分析器Stop Analyzer 停用词分析器类似于简单分析器但还支持停用词的移除。 关键字分析器Keyword Analyzer 关键字分析器是一个“无操作”分析器接受任何文本并输出与原始文本相同的单个项。 模式分析器Pattern Analyzer 模式分析器使用正则表达式将文本划分为项。它支持小写处理和停用词的移除。 语言分析器Language Analyzers Elasticsearch提供了许多语言特定的分析器如英语或法语。 指纹分析器Fingerprint Analyzer 指纹分析器是一个专门的分析器用于创建用于重复检测的指纹。 自定义分析器Custom Analyzers 如果找不到适合您需求的分析器您可以创建一个自定义分析器结合适当的字符过滤器、标记器和标记过滤器。
分词器参考
一个分词器接收一系列字符流将其分解成单独的分词通常是单个单词并输出一系列分词。例如一个空格分词器会在看到任何空格时将文本分成分词。它会将文本 “Quick brown fox!” 转换为词项 [Quick, brown, fox!]。
分词器还负责记录以下信息
●每个词项的顺序或位置用于短语和单词接近查询。 ●每个词项表示的原始单词的起始和结束字符偏移量用于突出显示搜索片段。 ●分词类型对生成的每个词项进行分类如 、 或 。更简单的分析器只生成单词分词类型。
Elasticsearch内置了许多分词器可以用于构建自定义分析器。
面向单词的分词器
以下的分词器通常用于将全文分词成单独的单词 标准分词器Standard Tokenizer 标准分词器根据Unicode文本分割算法在单词边界将文本划分为词项。它移除大多数标点符号。对于大多数语言来说这是最佳选择。 字母分词器Letter Tokenizer 字母分词器在遇到非字母字符时将文本划分为词项。 小写分词器Lowercase Tokenizer 小写分词器类似于字母分词器在遇到非字母字符时将文本划分为词项但还将所有词项转换为小写。 空格分词器Whitespace Tokenizer 空格分词器在遇到任何空格字符时将文本划分为词项。 UAX URL Email 分词器UAX URL Email Tokenizer uax_url_email 分词器类似于标准分词器不过它识别URL和电子邮件地址作为单个词项。 经典分词器Classic Tokenizer 经典分词器是一种基于语法的英语语言分词器。 泰语分词器Thai Tokenizer 泰语分词器将泰文文本分割成单词。
面向部分单词的分词器
这些分词器将文本或单词分割成小片段用于部分单词匹配 N-Gram 分词器N-Gram Tokenizer ngram 分词器可以在遇到指定字符列表之一例如空格或标点符号时将文本分解为词项然后返回每个词项的n-gram连续字母的滑动窗口例如 quick → [qu, ui, ic, ck]。 边缘 N-Gram 分词器Edge N-Gram Tokenizer 边缘 ngram 分词器可以在遇到指定字符列表之一例如空格或标点符号时将文本分解为词项然后返回每个词项的n-gram这些n-gram锚定在单词的开头例如 quick → [q, qu, qui, quic, quick]。
结构化文本分词器
以下的分词器通常用于结构化文本如标识符、电子邮件地址、邮政编码和路径而不是用于全文 关键字分词器Keyword Tokenizer 关键字分词器是一个“无操作”分词器接受任何文本并输出与原始文本相同的单个词项。它可以与分词过滤器如小写化结合使用以规范分析后的词项。 模式分词器Pattern Tokenizer 模式分词器使用正则表达式可以在匹配单词分隔符时将文本分解为词项或捕获匹配的文本作为词项。 简单模式分词器Simple Pattern Tokenizer 简单模式分词器使用正则表达式捕获匹配的文本作为词项。它使用正则表达式功能的有限子集通常比模式分词器更快。 字符组分词器Char Group Tokenizer 字符组分词器可通过一组要分割的字符进行配置通常比运行正则表达式更经济。 简单模式拆分分词器Simple Pattern Split Tokenizer 简单模式拆分分词器使用与简单模式分词器相同的有限正则表达式子集但在匹配时分割输入而不是将匹配作为词项返回。 路径分词器Path Tokenizer path_hierarchy 分词器接受分层值如文件系统路径按路径分隔符拆分并为树中的每个组件发出一个词
分词过滤器参考Token filter reference
官网参考Token filter reference 分词过滤器Token filters接受来自分词器的分词流tokens可以修改分词例如小写化、删除分词例如去除停用词或添加分词例如同义词。Elasticsearch提供了多个内置的分词过滤器可以用它们来构建自定义分析器。 ApostrophetokenfilterASCIIfoldingtokenfilterCJKbigramtokenfilterCJKwidthtokenfilterClassictokenfilterCommongramstokenfilterConditionaltokenfilterDecimaldigittokenfilterDelimitedpayloadtokenfilterDictionarydecompoundertokenfilterEdgen-gramtokenfilterElisiontokenfilterFingerprinttokenfilterFlattengraphtokenfilterHunspelltokenfilterHyphenationdecompoundertokenfilterKeeptypestokenfilterKeepwordstokenfilterKeywordmarkertokenfilterKeywordrepeattokenfilterKStemtokenfilterLengthtokenfilterLimittokencounttokenfilterLowercasetokenfilterMinHashtokenfilterMultiplexertokenfilterN-gramtokenfilterNormalizationtokenfiltersPatterncapturetokenfilterPatternreplacetokenfilterPhonetictokenfilterPorterstemtokenfilterPredicatescripttokenfilterRemoveduplicatestokenfilterReversetokenfilterShingletokenfilterSnowballtokenfilterStemmertokenfilterStemmeroverridetokenfilterStoptokenfilterSynonymtokenfilterSynonymgraphtokenfilterTrimtokenfilterTruncatetokenfilterUniquetokenfilterUppercasetokenfilterWorddelimitertokenfilterWorddelimitergraphtokenfilter
字符过滤器参考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和过滤器lowercase、asciifolding。然后我们将这个规范化器应用于索引中的foo字段。