雖然 Elasticsearch 帶有一些現成的分析器,然而在分析器上 Elasticsearch 真正的強大之處在于,你可以通過在一個適合你的特定數據的設置之中組合<mark>字符過濾器、分詞器、詞匯單元過濾器</mark>來創建自定義的分析器。
<br/>
一個分析器就是在一個包里面組合了三種函數的一個包裝器, 三種函數按照如下順序被執行:
**1. 字符過濾器**
字符過濾器用來整理一個尚未被分詞的字符串。
* html 清除字符過濾器
如果我們的文本是 HTML 格式的,它會包含像` <p>` 或者 `<div>` 這樣的 HTML 標簽,這些標簽是我們不想索引的。我們可以使用html清除字符過濾器來移除掉所有的 HTML 標簽,并且像把 `Á`這樣的字符轉換為相對應的 Unicode 字符 á 這樣轉換 為HTML 實體。
一個分析器可能有 0 個或者多個字符過濾器。
**2. 分詞器**
一個分析器必須有一個唯一的分詞器。 分詞器把字符串分解成單個詞條或者詞匯單元。
* 標準分詞器:標準分析器里使用的標準分詞器把一個字符串根據單詞邊界分解成單個詞條,并且移除掉大部分的標點符號。
* 關鍵詞分詞器:完整地輸出接收到的同樣的字符串,并不做任何分詞。
* 空格分詞器:只根據空格分割文本 。
* 正則分詞器:根據匹配正則表達式來分割文本 。
**3. 詞單元過濾器**
經過分詞,作為結果的詞單元流會按照指定的順序通過指定的詞單元過濾器 。詞單元過濾器可以修改、添加或者移除詞單元。
* lowercase詞過濾器:將分詞規范化為小寫,它通過language參數支持希臘語、愛爾蘭語和土耳其語小寫標記過濾器。
* 詞干過濾器:把單詞遏制為詞干。
* ascii_folding 過濾器:移除變音符,把一個像 `très` 這樣的詞轉換為 `tres`。
* ngram 和 edge_ngram 詞單元過濾器:可以產生適合用于部分匹配或者自動補全的詞單元。
<br/>
如下創建自定義分析器:
```json
# my_index是創建的索引
PUT /my_index
{
"settings":{
"analysis":{
"char_filter":{ # 字符過濾器配置
"&_to_and":{
"type":"mapping", # 字符串過濾器類型
"mappings":[
"&=> and "
]
}
},
"filter":{ # 詞單元過濾器配置
"my_stopwords":{
"type":"stop", # 詞單元過濾器類型
"stopwords":[
"the",
"a"
]
}
},
"analyzer":{ # 分析器配置
"my_analyzer":{
"type":"custom",
"char_filter":[
"html_strip",
"&_to_and"
],
"tokenizer":"standard", # 分詞器
"filter":[
"lowercase",
"my_stopwords"
]
}
}
}
}
}
```
測試結果如下,表明該分析器可用。
```json
GET /my_index/_analyze
{
"text":"The quick & brown fox",
"analyzer": "my_analyzer"
}
響應結果如下:
{
"tokens" : [
{
"token" : "quick",
"start_offset" : 4,
"end_offset" : 9,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "and",
"start_offset" : 10,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "brown",
"start_offset" : 12,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "fox",
"start_offset" : 18,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch與Solr
- 數據結構
- 安裝Elasticsearch
- Linux單機安裝
- Windows單機安裝
- 安裝Kibana
- Linux安裝
- Windows安裝
- es基本語句
- 索引操作
- 文檔操作
- 映射操作
- 高級查詢
- es-JavaAPI
- maven依賴
- 索引操作
- 文檔操作
- 高級查詢
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 類型(Type)
- 文檔(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系統架構
- 分布式集群
- 單節點集群
- 故障轉移
- 水平擴容
- 應對故障
- 路由計算
- 分片控制
- 寫流程
- 讀流程
- 更新流程
- 多文檔操作流程
- 分片原理
- 倒排索引
- 文檔搜索
- 動態更新索引
- 近實時搜索
- 持久化變更
- 段合并
- 文檔分析
- 內置分析器
- 分析器使用場景
- 測試分析器
- 指定分析器
- 自定義分析器
- 文檔處理
- 文檔沖突
- 樂觀并發控制
- 外部系統版本控制
- es優化
- 硬件選擇
- 分片策略
- 合理設置分片數
- 推遲分片分配
- 路由選擇
- 寫入速度優化
- 批量數據提交
- 優化存儲設備
- 合理使用合并
- 減少Refresh的次數
- 加大Flush設置
- 減少副本的數量
- 內存設置
- 重要配置
- es常見問題
- 為什么要使用Elasticsearch
- master選舉流程
- 集群腦裂問題
- 索引文檔流程
- 更新和刪除文檔流程
- 搜索流程
- ES部署在Linux時的優化方法
- GC方面ES需要注意的點
- ES對大數據量的聚合實現
- 并發時保證讀寫一致性
- 字典樹
- ES的倒排索引
- Spring Data Elasticsearch
- 環境搭建
- 索引操作
- 文檔操作