## 分析和分析器
**分析(analysis)**是這樣一個過程:
* 首先,標記化一個文本塊為適用于倒排索引單獨的**詞(term)**
* 然后標準化這些詞為標準形式,提高它們的“可搜索性”或“查全率”
這個工作是**分析器(analyzer)**完成的。一個**分析器(analyzer)**只是一個包裝用于將三個功能放到一個包里:
### 字符過濾器
首先字符串經過**字符過濾器(character filter)**,它們的工作是在標記化前處理字符串。字符過濾器能夠去除HTML標記,或者轉換`"&"`為`"and"`。
### 分詞器
下一步,**分詞器(tokenizer)**被標記化成獨立的詞。一個簡單的**分詞器(tokenizer)**可以根據空格或逗號將單詞分開(譯者注:這個在中文中不適用)。
### 標記過濾
最后,每個詞都通過所有**標記過濾(token filters)**,它可以修改詞(例如將`"Quick"`轉為小寫),去掉詞(例如停用詞像`"a"`、`"and"`、`"the"`等等),或者增加詞(例如同義詞像`"jump"`和`"leap"`)
Elasticsearch提供很多開箱即用的字符過濾器,分詞器和標記過濾器。這些可以組合來創建自定義的分析器以應對不同的需求。我們將在《自定義分析器》章節詳細討論。
### 內建的分析器
不過,Elasticsearch還附帶了一些預裝的分析器,你可以直接使用它們。下面我們列出了最重要的幾個分析器,來演示這個字符串分詞后的表現差異:
"Set the shape to semi-transparent by calling set_trans(5)"
### 標準分析器
標準分析器是Elasticsearch默認使用的分析器。對于文本分析,它對于任何語言都是最佳選擇(譯者注:就是沒啥特殊需求,對于任何一個國家的語言,這個分析器就夠用了)。它根據[Unicode Consortium](http://www.unicode.org/reports/tr29/)的定義的**單詞邊界(word boundaries)**來切分文本,然后去掉大部分標點符號。最后,把所有詞轉為小寫。產生的結果為:
set, the, shape, to, semi, transparent, by, calling, set_trans, 5
### 簡單分析器
簡單分析器將非單個字母的文本切分,然后把每個詞轉為小寫。產生的結果為:
set, the, shape, to, semi, transparent, by, calling, set, trans
### 空格分析器
空格分析器依據空格切分文本。它不轉換小寫。產生結果為:
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
### 語言分析器
特定語言分析器適用于很多語言。它們能夠考慮到特定語言的特性。例如,`english`分析器自帶一套英語停用詞庫——像`and`或`the`這些與語義無關的通用詞。這些詞被移除后,因為語法規則的存在,英語單詞的主體含義依舊能被理解(譯者注:`stem English words`這句不知道該如何翻譯,查了字典,我理解的大概意思應該是將英語語句比作一株植物,去掉無用的枝葉,主干依舊存在,停用詞好比枝葉,存在與否并不影響對這句話的理解。)。
`english`分析器將會產生以下結果:
set, shape, semi, transpar, call, set_tran, 5
注意`"transparent"`、`"calling"`和`"set_trans"`是如何轉為詞干的。
### 當分析器被使用
當我們**索引(index)**一個文檔,全文字段會被分析為單獨的詞來創建倒排索引。不過,當我們在全文字段**搜索(search)**時,我們要讓查詢字符串經過**同樣的分析流程**處理,以確保這些詞在索引中存在。
全文查詢我們將在稍后討論,理解每個字段是如何定義的,這樣才可以讓它們做正確的事:
* 當你查詢**全文(full text)**字段,查詢將使用相同的分析器來分析查詢字符串,以產生正確的詞列表。
* 當你查詢一個**確切值(exact value)**字段,查詢將不分析查詢字符串,但是你可以自己指定。
現在你可以明白為什么《映射和分析》的開頭會產生那種結果:
* `date`字段包含一個確切值:單獨的一個詞`"2014-09-15"`。
* `_all`字段是一個全文字段,所以分析過程將日期轉為三個詞:`"2014"`、`"09"`和`"15"`。
當我們在`_all`字段查詢`2014`,它一個匹配到12條推文,因為這些推文都包含詞`2014`:
```sh
GET /_search?q=2014 # 12 results
```
當我們在`_all`字段中查詢`2014-09-15`,首先分析查詢字符串,產生匹配**任一**詞`2014`、`09`或`15`的查詢語句,它依舊匹配12個推文,因為它們都包含詞`2014`。
```sh
GET /_search?q=2014-09-15 # 12 results !
```
當我們在`date`字段中查詢`2014-09-15`,它查詢一個**確切**的日期,然后只找到一條推文:
```sh
GET /_search?q=date:2014-09-15 # 1 result
```
當我們在`date`字段中查詢`2014`,沒有找到文檔,因為沒有文檔包含那個確切的日期:
```sh
GET /_search?q=date:2014 # 0 results !
```
### 測試分析器
尤其當你是Elasticsearch新手時,對于如何分詞以及存儲到索引中理解起來比較困難。為了更好的理解如何進行,你可以使用`analyze` API來查看文本是如何被分析的。在查詢字符串參數中指定要使用的分析器,被分析的文本做為請求體:
```javascript
GET /_analyze?analyzer=standard&text=Text to analyze
```
結果中每個節點在代表一個詞:
```Javascript
{
"tokens": [
{
"token": "text",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "to",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "analyze",
"start_offset": 8,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 3
}
]
}
```
`token`是一個實際被存儲在索引中的詞。`position`指明詞在原文本中是第幾個出現的。`start_offset`和`end_offset`表示詞在原文本中占據的位置。
`analyze` API 對于理解Elasticsearch索引的內在細節是個非常有用的工具,隨著內容的推進,我們將繼續討論它。
### 指定分析器
當Elasticsearch在你的文檔中探測到一個新的字符串字段,它將自動設置它為全文`string`字段并用`standard`分析器分析。
你不可能總是想要這樣做。也許你想使用一個更適合這個數據的語言分析器。或者,你只想把字符串字段當作一個普通的字段——不做任何分析,只存儲確切值,就像字符串類型的用戶ID或者內部狀態字段或者標簽。
為了達到這種效果,我們必須通過**映射(mapping)**人工設置這些字段。
- Introduction
- 入門
- 是什么
- 安裝
- API
- 文檔
- 索引
- 搜索
- 聚合
- 小結
- 分布式
- 結語
- 分布式集群
- 空集群
- 集群健康
- 添加索引
- 故障轉移
- 橫向擴展
- 更多擴展
- 應對故障
- 數據
- 文檔
- 索引
- 獲取
- 存在
- 更新
- 創建
- 刪除
- 版本控制
- 局部更新
- Mget
- 批量
- 結語
- 分布式增刪改查
- 路由
- 分片交互
- 新建、索引和刪除
- 檢索
- 局部更新
- 批量請求
- 批量格式
- 搜索
- 空搜索
- 多索引和多類型
- 分頁
- 查詢字符串
- 映射和分析
- 數據類型差異
- 確切值對決全文
- 倒排索引
- 分析
- 映射
- 復合類型
- 結構化查詢
- 請求體查詢
- 結構化查詢
- 查詢與過濾
- 重要的查詢子句
- 過濾查詢
- 驗證查詢
- 結語
- 排序
- 排序
- 字符串排序
- 相關性
- 字段數據
- 分布式搜索
- 查詢階段
- 取回階段
- 搜索選項
- 掃描和滾屏
- 索引管理
- 創建刪除
- 設置
- 配置分析器
- 自定義分析器
- 映射
- 根對象
- 元數據中的source字段
- 元數據中的all字段
- 元數據中的ID字段
- 動態映射
- 自定義動態映射
- 默認映射
- 重建索引
- 別名
- 深入分片
- 使文本可以被搜索
- 動態索引
- 近實時搜索
- 持久化變更
- 合并段
- 結構化搜索
- 查詢準確值
- 組合過濾
- 查詢多個準確值
- 包含,而不是相等
- 范圍
- 處理 Null 值
- 緩存
- 過濾順序
- 全文搜索
- 匹配查詢
- 多詞查詢
- 組合查詢
- 布爾匹配
- 增加子句
- 控制分析
- 關聯失效
- 多字段搜索
- 多重查詢字符串
- 單一查詢字符串
- 最佳字段
- 最佳字段查詢調優
- 多重匹配查詢
- 最多字段查詢
- 跨字段對象查詢
- 以字段為中心查詢
- 全字段查詢
- 跨字段查詢
- 精確查詢
- 模糊匹配
- Phrase matching
- Slop
- Multi value fields
- Scoring
- Relevance
- Performance
- Shingles
- Partial_Matching
- Postcodes
- Prefix query
- Wildcard Regexp
- Match phrase prefix
- Index time
- Ngram intro
- Search as you type
- Compound words
- Relevance
- Scoring theory
- Practical scoring
- Query time boosting
- Query scoring
- Not quite not
- Ignoring TFIDF
- Function score query
- Popularity
- Boosting filtered subsets
- Random scoring
- Decay functions
- Pluggable similarities
- Conclusion
- Language intro
- Intro
- Using
- Configuring
- Language pitfalls
- One language per doc
- One language per field
- Mixed language fields
- Conclusion
- Identifying words
- Intro
- Standard analyzer
- Standard tokenizer
- ICU plugin
- ICU tokenizer
- Tidying text
- Token normalization
- Intro
- Lowercasing
- Removing diacritics
- Unicode world
- Case folding
- Character folding
- Sorting and collations
- Stemming
- Intro
- Algorithmic stemmers
- Dictionary stemmers
- Hunspell stemmer
- Choosing a stemmer
- Controlling stemming
- Stemming in situ
- Stopwords
- Intro
- Using stopwords
- Stopwords and performance
- Divide and conquer
- Phrase queries
- Common grams
- Relevance
- Synonyms
- Intro
- Using synonyms
- Synonym formats
- Expand contract
- Analysis chain
- Multi word synonyms
- Symbol synonyms
- Fuzzy matching
- Intro
- Fuzziness
- Fuzzy query
- Fuzzy match query
- Scoring fuzziness
- Phonetic matching
- Aggregations
- overview
- circuit breaker fd settings
- filtering
- facets
- docvalues
- eager
- breadth vs depth
- Conclusion
- concepts buckets
- basic example
- add metric
- nested bucket
- extra metrics
- bucket metric list
- histogram
- date histogram
- scope
- filtering
- sorting ordering
- approx intro
- cardinality
- percentiles
- sigterms intro
- sigterms
- fielddata
- analyzed vs not
- 地理坐標點
- 地理坐標點
- 通過地理坐標點過濾
- 地理坐標盒模型過濾器
- 地理距離過濾器
- 緩存地理位置過濾器
- 減少內存占用
- 按距離排序
- Geohashe
- Geohashe
- Geohashe映射
- Geohash單元過濾器
- 地理位置聚合
- 地理位置聚合
- 按距離聚合
- Geohash單元聚合器
- 范圍(邊界)聚合器
- 地理形狀
- 地理形狀
- 映射地理形狀
- 索引地理形狀
- 查詢地理形狀
- 在查詢中使用已索引的形狀
- 地理形狀的過濾與緩存
- 關系
- 關系
- 應用級別的Join操作
- 扁平化你的數據
- Top hits
- Concurrency
- Concurrency solutions
- 嵌套
- 嵌套對象
- 嵌套映射
- 嵌套查詢
- 嵌套排序
- 嵌套集合
- Parent Child
- Parent child
- Indexing parent child
- Has child
- Has parent
- Children agg
- Grandparents
- Practical considerations
- Scaling
- Shard
- Overallocation
- Kagillion shards
- Capacity planning
- Replica shards
- Multiple indices
- Index per timeframe
- Index templates
- Retiring data
- Index per user
- Shared index
- Faking it
- One big user
- Scale is not infinite
- Cluster Admin
- Marvel
- Health
- Node stats
- Other stats
- Deployment
- hardware
- other
- config
- dont touch
- heap
- file descriptors
- conclusion
- cluster settings
- Post Deployment
- dynamic settings
- logging
- indexing perf
- rolling restart
- backup
- restore
- conclusion