一、基礎(chǔ)概念
Elasticsearch 是一個分布式搜索和分析引擎,它使用JSON文檔來存儲數(shù)據(jù)。索引是Elasticsearch中數(shù)據(jù)的基本組織單元之一,下面是Elasticsearch索引相關(guān)的基本概念:
Elasticsearch與MySQL的類比
1. ES與MySQL的結(jié)構(gòu)類比圖
2. ES與MySQL的類比示意表格
結(jié)構(gòu)元素 | Elasticsearch | MySQL |
---|---|---|
數(shù)據(jù)庫 | 索引(Index) | 數(shù)據(jù)庫(Database) |
表格 | 類型(Type)* | 表(Table) |
記錄/行 | 文檔(Document) | 記錄(Row) |
列/字段 | 字段(Field) | 列(Column) |
主鍵 | _id 字段 | 主鍵(Primary Key) |
查詢語言 | Query DSL | SQL |
注意:在Elasticsearch 7.x版本之后,不再使用類型(Type)的概念,每個索引只包含文檔。所以在新版本中,沒有類型,只有索引和文檔。因此es的索引我們也可以類比為mysql中的數(shù)據(jù)表
3. 索引中重要概念
索引(Index)
- 索引是Elasticsearch中的主要
數(shù)據(jù)存儲單元
。它類似于傳統(tǒng)數(shù)據(jù)庫中的表,但更加靈活。 - 索引用于存儲相關(guān)文檔,這些文檔可能屬于不同的數(shù)據(jù)類型,但具有共同的查詢需求。
- 一個索引可以包含許多文檔,每個文檔都是一個JSON對象。
文檔(Document)
-
文檔是索引中的基本數(shù)據(jù)單元
。每個文檔都是一個JSON對象,它包含了數(shù)據(jù)字段和對應的值。 - 例如,在一個名為"books"的索引中,每個文檔可能表示一本書,包含書名、作者、出版日期等字段。
字段(Field)
- 字段(Field)是文檔(Document)中包含數(shù)據(jù)的單個元素。字段可以包含不同類型的數(shù)據(jù),如文本、數(shù)字、日期等
映射(Mapping)
-
映射定義索引中每個字段的數(shù)據(jù)類型和屬性
。它告訴Elasticsearch如何解釋和處理每個字段的數(shù)據(jù)。 - 映射可以自動創(chuàng)建,也可以手動定義以更精確地控制字段的處理。
二、定義索引
在開發(fā)中es的index我們可以預先定義好,包括索引的別名(alias)、設(shè)置(settings)、映射(mappings)等。如果直接用默認的設(shè)置,添加文檔時es會自動幫我們創(chuàng)建索引,但默認的不一定符合我們的需求
索引的組成
創(chuàng)建Elasticsearch索引的過程通常包括三個關(guān)鍵部分:別名(Aliases)、設(shè)置(Settings)、和映射(Mappings),每個部分的作用如下:
-
別名(Aliases):
- 別名是索引的可選名稱,允許您將一個或多個索引關(guān)聯(lián)到一個別名上。
- 別名用于簡化查詢和索引維護,可以用于切換索引版本、滾動索引、分離索引等操作。
- 通過別名可以在不更改查詢的情況下輕松切換索引,這對于數(shù)據(jù)版本管理非常有用
-
設(shè)置(Settings):
- 設(shè)置包括了索引的配置參數(shù),它們會影響索引的行為和性能。
- 設(shè)置可以包括索引的分片和副本配置、刷新間隔、合并策略、搜索相關(guān)配置等。
- 通過設(shè)置可以調(diào)整索引以滿足特定需求。例如,可以設(shè)置分片的數(shù)量、副本的數(shù)量、自定義分析器等。
-
映射(Mappings):
- 映射定義了索引中每個字段的數(shù)據(jù)類型和屬性。它告訴Elasticsearch如何解釋和處理文檔中的數(shù)據(jù)。
- 可以選擇讓Elasticsearch自動創(chuàng)建映射(Dynamic Mapping),或者可以顯式定義映射以更精確地控制字段的處理(
推薦顯式定義
)。 - 映射定義通常包括字段名稱、數(shù)據(jù)類型(如文本、整數(shù)、日期等)、分析器(用于文本字段的文本分詞)等信息。
索引示例
使用Elasticsearch的REST API來創(chuàng)建一個名為"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(設(shè)置):
- 在設(shè)置部分,您可以配置索引的全局設(shè)置。
-
number_of_shards
:指定索引分成的主分片數(shù)量。在示例中,索引分成了5個主分片。 -
number_of_replicas
:指定每個主分片的副本數(shù)量。在示例中,每個主分片有2個副本,用于提高數(shù)據(jù)冗余和可用性。
mappings(映射):
- 映射定義了索引中的字段及其數(shù)據(jù)類型和屬性。
- 在示例中,有三個字段定義:
-
title
:類型為"text",使用"standard"分析器。這是一個文本字段,通常用于全文搜索。 -
author
:類型為"keyword"。這是一個關(guān)鍵字字段,通常用于精確匹配和聚合。 -
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"的索引別名。
-
索引設(shè)置(Settings):
- “index”: 這是索引的根配置。
- “refresh_interval”: 索引的刷新間隔設(shè)置為"5s",表示每5秒進行一次刷新。
- “max_inner_result_window”: 設(shè)置內(nèi)部結(jié)果窗口的最大大小為"10000"。
- “max_result_window”: 設(shè)置結(jié)果窗口的最大大小為"20000"。
- “analysis”: 這是索引的文本分析配置。
- “analyzer”: 文本分析器的配置。
- “pinyin_analyzer”: 這是一個名為"pinyin_analyzer"的分析器。
- “tokenizer”: 指定了使用的分詞器,這里使用了名為"my_pinyin"的自定義分詞器。
- “pinyin_analyzer”: 這是一個名為"pinyin_analyzer"的分析器。
- “tokenizer”: 自定義分詞器的配置。
- “my_pinyin”: 這是一個名為"my_pinyin"的分詞器,類型為"pinyin"。
- “keep_separate_first_letter”: 設(shè)置為"false",表示不保留拼音的首字母。
- “keep_full_pinyin”: 設(shè)置為"true",表示保留完整拼音。
- “keep_original”: 設(shè)置為"true",表示保留原始文本。
- “l(fā)imit_first_letter_length”: 設(shè)置首字母的長度限制為"16"。
- “l(fā)owercase”: 設(shè)置為"true",表示將拼音轉(zhuǎn)換為小寫。
- “remove_duplicated_term”: 設(shè)置為"true",表示刪除重復的詞項。
- “my_pinyin”: 這是一個名為"my_pinyin"的分詞器,類型為"pinyin"。
- “char_filter”: 字符過濾器的配置。
- “pinyin_multi”: 這是一個名為"pinyin_multi"的字符過濾器,類型為"mapping",用于將特定字符映射為其他字符。
- “pinyin_first”: 這是一個名為"pinyin_first"的字符過濾器,類型為"mapping",使用了外部文件"pinyin_first.txt"中的映射。
- “remove_space”: 這是一個名為"remove_space"的字符過濾器,類型為"pattern_replace",用于移除指定的空格和標點符號。
- “pattern”: 指定了匹配的正則表達式模式。
- “replacement”: 指定了替換的字符。
- “normalizer”: 規(guī)范化器的配置。
- “sort_normalizer”: 這是一個名為"sort_normalizer"的自定義規(guī)范化器。
- “char_filter”: 包括了字符過濾器,包括"remove_space"、“pinyin_multi"和"pinyin_first”。
- “filter”: 包括了過濾器,包括"cjk_width"和"asciifolding"。
- “sort_normalizer”: 這是一個名為"sort_normalizer"的自定義規(guī)范化器。
- “analyzer”: 文本分析器的配置。
- “index”: 這是索引的根配置。
-
映射(Mappings):
- “dynamic”: 設(shè)置為"false",表示禁用動態(tài)映射,索引中的字段需要明確定義,不允許自動添加新字段。
四、官方文檔(參考)
分析器配置
參考:Configure text analysis
-
默認情況下,Elasticsearch對所有文本分析使用標準分析器
。標準分析器為大多數(shù)自然語言和用例提供開箱即用的支持。如果選擇使用標準分析器,通常不需要進一步的配置。 -
如果標準分析器不滿足您的需求,請查看和測試Elasticsearch的其他內(nèi)置分析器。內(nèi)置分析器不需要配置,但某些支持選項可用于調(diào)整其行為。例如,您可以配置標準分析器,以去除自定義停用詞的列表。
-
如果沒有內(nèi)置分析器滿足您的需求,您可以測試并創(chuàng)建自定義分析器。自定義分析器涉及選擇和組合不同的分析器組件,從而提供更大的控制權(quán)。
分析器測試(Test an analyzer)
analyzer API 用于查看由分析器生成的術(shù)語。內(nèi)置分析器可以在請求中內(nèi)聯(lián)指定:POST _analyze { "analyzer": "whitespace", "text": "今天 是 周五" }
執(zhí)行結(jié)果
{ "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?" }
配置內(nèi)置分析器(Configuring built-in analyzers)
內(nèi)置分析器無需任何配置即可直接使用
。 然而,其中一些支持配置選項來改變其行為。例如,標準分析器可以配置為支持停用詞列表:
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提供了多種指定內(nèi)置或自定義分析器的方法:
- 通過文本字段、索引或查詢
- 用于索引或搜索時
- 在需要時,可以在不同級別和不同時間指定分析器,這是靈活性的體現(xiàn)。
- 在大多數(shù)情況下,采用簡單的方法最有效:為每個文本字段指定一個分析器,如在“為字段指定分析器”中所述。
- 這種方法與Elasticsearch的默認行為很好地配合,讓您可以在索引和搜索時使用相同的分析器。它還讓您能夠通過使用"get mapping" API快速查看哪個分析器適用于哪個字段。
- 如果您通常不為索引創(chuàng)建映射,您可以使用索引模板來實現(xiàn)類似的效果。
Elasticsearch如何確定索引分析器:
Elasticsearch通過按以下順序檢查以下參數(shù)來確定要使用的索引分析器:
- 字段的分析器映射參數(shù)。請參閱“為字段指定分析器”。
- analysis.analyzer.default索引設(shè)置。請參閱“為索引指定默認分析器”。
- 如果沒有指定上述參數(shù),則使用標準分析器。
為字段指定分析器:
在映射索引時,您可以使用分析器映射參數(shù)為每個文本字段指定一個分析器。以下是一個創(chuàng)建索引的API請求示例,將空格分析器設(shè)置為標題字段的分析器:
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
為索引指定默認分析器:
除了字段級分析器,您還可以使用analysis.analyzer.default設(shè)置為索引設(shè)置一個備用分析器。以下是一個創(chuàng)建索引的API請求示例,將簡單分析器設(shè)置為my-index-000001的備用分析器:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
}
}
}
}
}
Elasticsearch如何確定搜索分析器:在大多數(shù)情況下,指定不同的搜索分析器是不必要的
。這樣做可能會對相關(guān)性產(chǎn)生負面影響,導致意外的搜索結(jié)果。
如果選擇指定單獨的搜索分析器,我們建議在部署到生產(chǎn)環(huán)境之前進行徹底的分析配置測試。
在搜索時,Elasticsearch通過按以下順序檢查以下參數(shù)來確定要使用的分析器:
- 查詢中的analyzer參數(shù)。請參閱“為查詢指定搜索分析器”。
- 字段的search_analyzer映射參數(shù)。請參閱“為字段指定搜索分析器”。
- analysis.analyzer.default_search索引設(shè)置。請參閱“為索引指定默認搜索分析器”。
- 字段的分析器映射參數(shù)。請參閱“為字段指定分析器”。
-
如果沒有指定上述參數(shù),則使用標準分析器
。
為查詢指定搜索分析器:
在編寫全文查詢時,您可以使用analyzer參數(shù)來指定搜索分析器。如果提供了此參數(shù),它將覆蓋任何其他搜索分析器。以下是一個示例,為匹配查詢設(shè)置了停用詞分析器作為搜索分析器:
GET my-index-000001/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
為字段指定搜索分析器:
在映射索引時,您可以使用search_analyzer映射參數(shù)為每個文本字段指定搜索分析器。如果提供了搜索分析器,則必須還使用analyzer參數(shù)指定索引分析器。以下是一個創(chuàng)建索引的API請求示例,將簡單分析器設(shè)置為標題字段的搜索分析器:
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
為索引指定默認搜索分析器:
在創(chuàng)建索引時,您可以使用analysis.analyzer.default_search設(shè)置為索引設(shè)置一個默認搜索分析器。如果提供了搜索分析器,則必須使用analysis.analyzer.default設(shè)置指定默認索引分析器。以下是一個創(chuàng)建索引的API請求示例,將空格分析器設(shè)置為my-index-000001的默認搜索分析器:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}
這些設(shè)置和指定分析器的方式可根據(jù)您的需求和索引映射的復雜程度進行調(diào)整。根據(jù)具體的需求,您可以選擇使用簡單或復雜的分析配置。
內(nèi)置分析器參考
官網(wǎng)參考:Built-in analyzer reference
Elasticsearch內(nèi)置了各種分析器,可以在不需要進一步配置的情況下用于任何索引:
-
標準分析器(Standard Analyzer)
- 標準分析器根據(jù)Unicode文本分割算法在單詞邊界將文本劃分為項(terms)。
- 它移除大多數(shù)標點符號、將項轉(zhuǎn)換為小寫,并支持移除停用詞。
-
簡單分析器(Simple Analyzer)
- 簡單分析器在遇到非字母字符時將文本劃分為項。
- 它將所有項轉(zhuǎn)換為小寫。
-
空格分析器(Whitespace Analyzer)
- 空格分析器在遇到任何空格字符時將文本劃分為項。
- 它不將項轉(zhuǎn)換為小寫。
-
停用詞分析器(Stop Analyzer)
- 停用詞分析器類似于簡單分析器,但還支持停用詞的移除。
-
關(guān)鍵字分析器(Keyword Analyzer)
- 關(guān)鍵字分析器是一個“無操作”分析器,接受任何文本并輸出與原始文本相同的單個項。
-
模式分析器(Pattern Analyzer)
- 模式分析器使用正則表達式將文本劃分為項。
- 它支持小寫處理和停用詞的移除。
-
語言分析器(Language Analyzers)
- Elasticsearch提供了許多語言特定的分析器,如英語或法語。
-
指紋分析器(Fingerprint Analyzer)
- 指紋分析器是一個專門的分析器,用于創(chuàng)建用于重復檢測的指紋。
-
自定義分析器(Custom Analyzers)
- 如果找不到適合您需求的分析器,您可以創(chuàng)建一個自定義分析器,結(jié)合適當?shù)淖址^濾器、標記器和標記過濾器。
分詞器參考
一個分詞器接收一系列字符流,將其分解成單獨的分詞(通常是單個單詞),并輸出一系列分詞
。例如,一個空格分詞器會在看到任何空格時將文本分成分詞。它會將文本 “Quick brown fox!” 轉(zhuǎn)換為詞項 [Quick, brown, fox!]。
分詞器還負責記錄以下信息:
●每個詞項的順序或位置(用于短語和單詞接近查詢)。
●每個詞項表示的原始單詞的起始和結(jié)束字符偏移量(用于突出顯示搜索片段)。
●分詞類型,對生成的每個詞項進行分類,如 、 或 。更簡單的分析器只生成單詞分詞類型。
Elasticsearch內(nèi)置了許多分詞器,可以用于構(gòu)建自定義分析器。
面向單詞的分詞器
以下的分詞器通常用于將全文分詞成單獨的單詞:
-
標準分詞器(Standard Tokenizer)
- 標準分詞器根據(jù)Unicode文本分割算法在單詞邊界將文本劃分為詞項。
- 它移除大多數(shù)標點符號。
對于大多數(shù)語言來說,這是最佳選擇
。
-
字母分詞器(Letter Tokenizer)
- 字母分詞器在遇到非字母字符時將文本劃分為詞項。
-
小寫分詞器(Lowercase Tokenizer)
- 小寫分詞器,類似于字母分詞器,在遇到非字母字符時將文本劃分為詞項,但還將所有詞項轉(zhuǎn)換為小寫。
-
空格分詞器(Whitespace Tokenizer)
- 空格分詞器在遇到任何空格字符時將文本劃分為詞項。
-
UAX URL Email 分詞器(UAX URL Email Tokenizer)
- uax_url_email 分詞器類似于標準分詞器,不過它識別URL和電子郵件地址作為單個詞項。
-
經(jīng)典分詞器(Classic Tokenizer)
- 經(jīng)典分詞器是一種基于語法的英語語言分詞器。
-
泰語分詞器(Thai Tokenizer)
- 泰語分詞器將泰文文本分割成單詞。
面向部分單詞的分詞器
這些分詞器將文本或單詞分割成小片段,用于部分單詞匹配:
-
N-Gram 分詞器(N-Gram Tokenizer)
- ngram 分詞器可以在遇到指定字符列表之一(例如空格或標點符號)時將文本分解為詞項,然后返回每個詞項的n-gram(連續(xù)字母的滑動窗口),例如 quick → [qu, ui, ic, ck]。
-
邊緣 N-Gram 分詞器(Edge N-Gram Tokenizer)
- 邊緣 ngram 分詞器可以在遇到指定字符列表之一(例如空格或標點符號)時將文本分解為詞項,然后返回每個詞項的n-gram,這些n-gram錨定在單詞的開頭,例如 quick → [q, qu, qui, quic, quick]。
結(jié)構(gòu)化文本分詞器
以下的分詞器通常用于結(jié)構(gòu)化文本,如標識符、電子郵件地址、郵政編碼和路徑,而不是用于全文:
-
關(guān)鍵字分詞器(Keyword Tokenizer)
- 關(guān)鍵字分詞器是一個“無操作”分詞器,接受任何文本并輸出與原始文本相同的單個詞項。它可以與分詞過濾器(如小寫化)結(jié)合使用以規(guī)范分析后的詞項。
-
模式分詞器(Pattern Tokenizer)
- 模式分詞器使用正則表達式,可以在匹配單詞分隔符時將文本分解為詞項,或捕獲匹配的文本作為詞項。
-
簡單模式分詞器(Simple Pattern Tokenizer)
- 簡單模式分詞器使用正則表達式捕獲匹配的文本作為詞項。它使用正則表達式功能的有限子集,通常比模式分詞器更快。
-
字符組分詞器(Char Group Tokenizer)
- 字符組分詞器可通過一組要分割的字符進行配置,通常比運行正則表達式更經(jīng)濟。
-
簡單模式拆分分詞器(Simple Pattern Split Tokenizer)
- 簡單模式拆分分詞器使用與簡單模式分詞器相同的有限正則表達式子集,但在匹配時分割輸入,而不是將匹配作為詞項返回。
-
路徑分詞器(Path Tokenizer)
- path_hierarchy 分詞器接受分層值,如文件系統(tǒng)路徑,按路徑分隔符拆分,并為樹中的每個組件發(fā)出一個詞
分詞過濾器參考(Token filter reference)
官網(wǎng)參考:Token filter reference
分詞過濾器(Token filters)接受來自分詞器的分詞流(tokens),可以修改分詞(例如小寫化)、刪除分詞(例如去除停用詞)或添加分詞(例如同義詞)。Elasticsearch提供了多個內(nèi)置的分詞過濾器,可以用它們來構(gòu)建自定義分析器。
- 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)
官網(wǎng)參考:Character filters reference
-
字符過濾器(Character filters)用于在字符流傳遞給分詞器之前對其進行預處理。
-
字符過濾器接收原始文本作為字符流,并可以通過添加、刪除或更改字符來轉(zhuǎn)換字符流。例如,字符過濾器可以用于將印度-阿拉伯數(shù)字(?????????????)轉(zhuǎn)換為其阿拉伯-拉丁等效形式(0123456789),或者從流中剝離 HTML 元素,如 。
Elasticsearch 提供了多個內(nèi)置的字符過濾器,可以用它們來構(gòu)建自定義分析器。
- HTML 剝離字符過濾器(HTML Strip Character Filter):剝離 HTML 元素,如 ,并解碼 HTML 實體,如 &。
- 映射字符過濾器(Mapping Character Filter):替換指定字符串的任何出現(xiàn)次數(shù)為指定的替代字符串。
- 模式替換字符過濾器(Pattern Replace Character Filter):使用指定的替代字符串替換與正則表達式匹配的任何字符。
標準化器(Normalizers)
規(guī)范化器與分析器類似,不同之處在于它們只能發(fā)出單個令牌。因此,它們沒有標記化器,只接受可用的字符過濾器和標記過濾器的子集。只允許使用按字符工作的篩選器。例如,允許使用小寫過濾器,但不允許使用詞干過濾器,因為詞干過濾器需要將關(guān)鍵字作為一個整體來查看。可在規(guī)范化器中使用的過濾器的當前列表如下:阿拉伯規(guī)范化、asciifolding、bengali_normalization、cjk_width、decimal_digh、elision、german_normalization、hindi_normalizing、indic_normalization、小寫、persian_normalizion、scandinavian_folding、serbian_normalized、sorani_normalize、大寫。Elasticsearch附帶了一個小寫的內(nèi)置規(guī)范器。對于其他形式的規(guī)范化,需要自定義配置。
以下是一個示例,演示如何創(chuàng)建一個自定義規(guī)范化器:文章來源:http://www.zghlxwxcb.cn/news/detail-773593.html
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"
}
}
}
}
在上述示例中,我們創(chuàng)建了一個名為my_normalizer
的自定義規(guī)范化器,使用了字符過濾器quote
和過濾器lowercase
、asciifolding
。然后,我們將這個規(guī)范化器應用于索引中的foo
字段。文章來源地址http://www.zghlxwxcb.cn/news/detail-773593.html
到了這里,關(guān)于Elasticsearch基礎(chǔ)篇(五):創(chuàng)建es索引并學習分析器、過濾器、分詞器的作用和配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!