1. 程式人生 > >ElasticSearch查詢詳解

ElasticSearch查詢詳解

索引一條資料

curl  -XPUT 'localhost:9200/megacorp/employee/3' -d '  
{  
    "first_name" :  "Douglas",  
    "last_name" :   "Fir",  
    "age" :         35,  
    "about":        "I like to build cabinets",  
    "interests":  [ "forestry" ]  
}'  

「索引」含義的區分
你可能已經注意到索引(index)這個詞在Elasticsearch中有著不同的含義,所以有必要在此做一下區分:
1 索引(名詞) 如上文所述,一個索引(index)就像是傳統關係資料庫中的資料庫,它是相關文件儲存的地方,index的複數是 indices 或 indexes 。
2 索引(動詞) 「索引一個文件」表示把一個文件儲存到索引(名詞)裡,以便它可以被檢索或者查詢。
這很像SQL中的 INSERT 關鍵字,差別是,如果文件已經存在,新的文件將覆蓋舊的文件。
3 倒排索引 傳統資料庫為特定列增加一個索引,例如B-Tree索引來加速檢索。
Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的資料結構來達到相同目的。

—————————————檢索簡介————————————————–
檢索文件

curl  -XGET 'localhost:9200/megacorp/employee/1'  

簡單搜尋

curl  -XGET 'localhost:9200/megacorp/employee/_search'  
curl  -XGET 'localhost:9200/megacorp/employee/_search?q=last_name:Smith'  

使用DSL語句查詢

curl  -XGET 'localhost:9200/megacorp/employee/_search' -d '  
{  
    "
query" : { "match" : { "last_name" : "Smith" } } }'

複雜的搜尋 過濾器(filter)

curl  -XGET 'localhost:9200/megacorp/employee/_search' -d '  
{  
    "query" : {  
        "filtered" : {  
            "filter" : {  
                "range" : {  
                    "
age" : { "gt" : 30 } } }, "query" : { "match" : { "last_name" : "smith" } } } } }'

全文搜尋

curl  -XGET 'localhost:9200/megacorp/employee/_search' -d '  
{  
    "query" : {  
        "match" : {  
            "about" : "rock climbing"  
        }  
    }  
}'  

這個例子很好的解釋了Elasticsearch如何在各種文字欄位中進行全文搜尋,並且返回相關性最大的結果集

短語搜尋

curl  -XGET 'localhost:9200/megacorp/employee/_search' -d '  
{  
    "query" : {  
        "match_phrase" : {  
            "about" : "rock climbing"  
        }  
    }  
}'  

確切的匹配若干個單詞或者短語(phrases)

高亮我們的搜尋

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/_search’ -d ’
{
“query” : {
“match_phrase” : {
“about” : “rock climbing”
}
},
“highlight”: {
“fields” : {
“about” : {}
}
}
}’

—————————————聚合(aggregations)————————————————–

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/_search’ -d ’
{
“aggs”: {
“all_interests”: {
“terms”: { “field”: “interests” }
}
}
}’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/_search’ -d ’
{
“query”: {
“match”: {
“last_name”: “smith”
}
},
“aggs”: {
“all_interests”: {
“terms”: {
“field”: “interests”
}
}
}
}’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/_search’ -d ’
{
“aggs” : {
“all_interests” : {
“terms” : { “field” : “interests” },
“aggs” : {
“avg_age” : {
“avg” : { “field” : “age” }
}
}
}
}
}’

分散式特性
Elasticsearch致力於隱藏分散式系統的複雜性。以下這些操作都是在底層自動完成的:
1 將你的文件分割槽到不同的容器或者分片(shards)中,它們可以存在於一個或多個節點中。
2 將分片均勻的分配到各個節點,對索引和搜尋做負載均衡。
3 冗餘每一個分片,防止硬體故障造成的資料丟失。
4 將叢集中任意一個節點上的請求路由到相應資料所在的節點。
5 無論是增加節點,還是移除節點,分片都可以做到無縫的擴充套件和遷移。

————–分散式叢集————

一個節點(node)就是一個Elasticsearch例項,而一個叢集(cluster)由一個或多個節點組成,它們具有相同的cluster.name,它們協同工作,分享資料和負載。

做為使用者,我們能夠與叢集中的任何節點通訊,包括主節點。每一個節點都知道文件存在於哪個節點上,它們可以轉發請求到相應的節點上。
我們訪問的節點負責收集各節點返回的資料,最後一起返回給客戶端。這一切都由Elasticsearch處理。

——叢集健康——
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/_cluster/health’

green 所有主要分片和複製分片都可用
yellow 所有主要分片可用,但不是所有複製分片都可用
red 不是所有的主要分片都可用

——新增索引——
一個分片(shard)是一個最小級別 “工作單元(worker unit)” ,它只是儲存了索引中所有資料的一部分。
我們的文件儲存在分片中,並且在分片中被索引,但是我們的應用程式不會直接與它們通訊,取而代之的是,直接與索引通訊。
分片可以是主分片(primary shard)或者是複製分片(replica shard)
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XPUT ‘localhost:9200/blogs’ -d ’
{
“settings” : {
“number_of_shards” : 3,
“number_of_replicas” : 1
}
}’

在同一個節點上儲存相同的資料副本是沒有必要的,如果這個節點故障了,那所有的資料副本也會丟失。

Elasticsearch是一個分散式的文件(document)儲存引擎。
它可以實時儲存並檢索複雜資料結構——序列化的JSON文件。
換言說,一旦文件被儲存在Elasticsearch中,它就可以在叢集的任一節點上被檢索。

在Elasticsearch中,每一個欄位的資料都是預設被索引的。

3.1 索引
_index 類似關係資料庫的資料庫
_type 類似關係資料庫的表
_id 類似關係資料庫的主鍵

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
PUT /{index}/{type}/{id}
{
“field”: “value”,

}

id可以自動生成

3.2 獲取資料

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/1?pretty’

pretty引數 :在任意的查詢字串中增加pretty引數,類似於上面的例子。會讓Elasticsearch美化輸出(pretty-print)JSON響應以便更加容易閱讀。

通常,GET請求將返回文件的全部,儲存在_source引數中。
請求個別欄位可以使用_source引數,多個欄位可以使用逗號分隔
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/1?pretty&_source=first_name,last_name’

只想得到_source欄位
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/1/_source’

檢查文件是否存在
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -i -XHEAD ‘localhost:9200/megacorp/employee/1’

這隻表示你在查詢的那一刻文件不存在

——–建立一個新文件
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XPUT ‘localhost:9200/megacorp/employee/3?op_type=create’ -d ’
{
“first_name” : “Douglas”,
“last_name” : “Fir”,
“age” : 35,
“about”: “I like to build cabinets”,
“interests”: [ “forestry” ]
}’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XPUT ‘localhost:9200/megacorp/employee/4/_create’ -d ’
{
“first_name” : “Douglas”,
“last_name” : “Fir”,
“age” : 35,
“about”: “I like to build cabinets”,
“interests”: [ “forestry” ]
}’

刪除文件
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XDELETE ‘localhost:9200/megacorp/employee/4’

即使文件不存在——”found”的值是false——_version依舊增加了。
這是內部記錄的一部分,它確保在多節點間不同操作可以有正確的順序。

併發控制-處理衝突
樂觀併發控制
_version保證所有修改都被正確排序
利用_version的這一優點確保資料不會因為修改衝突而丟失。
我們可以指定文件的version來做想要的更改。
如果那個版本號不是現在的,我們的請求就失敗了。

檢索多個文件
_mget

批量操作
_bulk

——-分散式—–
當我們傳送請求,最好的做法是迴圈通過所有節點請求,這樣可以平衡負載。

新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能複製到相關的複製分片上。

routing
replication
consistency
timeout

批量格式
Elasticsearch則是從網路緩衝區中一行一行的直接讀取資料。它使用換行符識別和解析action/metadata行,以決定哪些分片來處理這個請求。
這些行請求直接轉發到對應的分片上。這些沒有冗餘複製,沒有多餘的資料結構。整個請求過程使用最小的記憶體在進行。

——–搜尋————
每個文件裡的欄位都會被索引並被查詢。
在簡單查詢時,Elasticsearch可以使用所有的索引,以非常快的速度返回結果。這讓你永遠不必考慮傳統資料庫的一些東西。

對映(Mapping) 資料在每個欄位中的解釋說明
分析(Analysis) 全文是如何處理的可以被搜尋的
領域特定語言查詢(Query DSL) Elasticsearch使用的靈活的、強大的查詢語言

空搜尋

多索引和多類別

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/employee/_search?q=+first_name:Jane+last_name:Smith’

curl -XGET ‘localhost:9200/megacorp/employee/_search?q=Smith’

* _all欄位
Elasticsearch把所有字串欄位值連線起來放在一個大字串中,它被索引為一個特殊的欄位_all

複雜的查詢
使用_all的複雜查詢
_all field
name欄位包含”mary”或”john”
date晚於2014-09-10
_all欄位包含”aggregations”或”geo”
+name:(mary john) +date:>2014-09-10 +(aggregations geo)

查詢字串搜尋允許任意使用者在索引中任何一個欄位上執行潛在的慢查詢語句,可能暴露私有資訊甚至使你的叢集癱瘓。

——對映和分析——

對映(mapping)機制用於進行欄位型別確認,將每個欄位匹配為一種確定的資料型別(string, number, booleans, date等)。

分析(analysis)機制用於進行全文文字(Full Text)的分詞,以建立供搜尋用的反向索引。

index 引數控制字串以何種方式被索引
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“tag”: {
“type”: “string”,
“index”: “not_analyzed”
}
}

analyzed 首先分析這個字串,然後索引。換言之,以全文形式索引此欄位。
not_analyzed 索引這個欄位,使之可以被搜尋,但是索引內容和指定值一樣。不分析此欄位。
no 不索引這個欄位。這個欄位不能為搜尋到。

對於analyzed型別的欄位

確切值(Exact values) vs. 全文文字(Full text)

**
分析(analysis)是分析器(analyzer)完成的。
一個分析器(analyzer)只是一個包裝用於將三個功能放到一個包裡
1 字元過濾器 首先字串經過字元過濾器(character filter),它們的工作是在表徵化(斷詞)前處理字串。字元過濾器能夠去除HTML標記,或者轉換 “&” 為 “and” 。
2 分詞器 被表徵化(斷詞)為獨立的詞。一個簡單的分詞器(tokenizer)可以根據空格或逗號將單詞分開(這個在中文中不適用)。
3 表徵過濾 最後,每個詞都通過所有表徵過濾(token filters),
它可以修改詞(例如將 “Quick” 轉為小寫),去掉詞(例如停用詞像 “a” 、 “and”“”the” 等等),或者增加詞(例如同義詞像 “jump” 和 “leap” )

Elasticsearch提供很多開箱即用的字元過濾器,分詞器和表徵過濾器。這些可以組合來建立自定義的分析器以應對不同的需求。

內建的分析器
1 標準分析器
2 簡單分析器
3 空格分析器
4 語言分析器

測試分析器
curl -XGET ‘localhost:9200/_analyze?analyzer=standard’

指定分析器

自動探測欄位的情況:
當Elasticsearch在你的文件中探測到一個新的字串欄位,它將自動設定它為全文 string 欄位並用 standard 分析器分析。

所以需要人工對映欄位

當你索引一個包含新欄位的文件(一個之前沒有的欄位)
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
Elasticsearch將使用動態對映猜測欄位型別,這型別來自於JSON的基本資料型別,使用以下規則:
Boolean: true or false “boolean”
Whole number: 123 “long”
Floating point: 123.45 “double”
String, valid date: “2014-09-15” “date”
String: “foo bar” “string”

增加新的對映欄位
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
PUT /gb/_mapping/tweet
{
“properties” : {
“tag” : {
“type” : “string”,
“index”: “not_analyzed”
}
}
}

你可以在第一次建立索引的時候指定對映的型別。此外,你也可以晚些時候為新型別新增對映
你可以向已有對映中增加欄位,但你不能修改它。
如果一個欄位在對映中已經存在,這可能意味著那個欄位的資料已經被索引。
如果你改變了欄位對映,那已經被索引的資料將錯誤並且不能被正確的搜尋到。
**我們可以更新一個對映來增加一個新欄位,但是不能把已有欄位的型別那個從 analyzed 改到 not_analyzed 。(修改了之後資料不會按照原有想法被查詢到)

檢視對映

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘localhost:9200/megacorp/_mapping/employee/’

** 複合核心欄位型別

1 陣列 :對於陣列不需要特殊的對映。任何一個欄位可以包含零個、一個或多個值,同樣對於全文欄位將被分析併產生多個詞。
陣列中所有值必須為同一型別,索引是沒有順序的,在搜尋階段你不能指定”第一個值”或者”最後一個值”。

2 空欄位 Lucene沒法存放 null 值,所以一個 null 值的欄位被認為是空欄位。
這四個欄位將被識別為空欄位而不被索引:
“empty_string”: “”,
“null_value”: null,
“empty_array”: [],
“array_with_null_value”: [ null ]

3 內部物件 - 如何被索引 - 扁平化檔案

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“tweet”: “Elasticsearch is very flexible”,
“user”: {
“id”: “@johnsmith”,
“gender”: “male”,
“age”: 26,
“name”: {
“full”: “John Smith”,
“first”: “John”,
“last”: “Smith”
}
}
}

索引的時候,一個 Lucene 檔案包含一個鍵-值對應的扁平表單。
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
“user.name.full”: [john, smith],
“user.name.first”: [john],
“user.name.last”: [smith]

**查詢與過濾

** 結構化查詢 DSL
1. 查詢字句
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“query”: {
“match”: {
“tweet”: “elasticsearch”
}
}
}

  1. 合併多個字句 : 以合併簡單的子句為一個複雜的查詢語句
    [java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
    {
    “bool”: {
    “must”: { “match”: { “tweet”: “elasticsearch” }},
    “must_not”: { “match”: { “name”: “mary” }},
    “should”: { “match”: { “tweet”: “full text” }}
    }
    }

** 查詢與過濾
過濾語句會詢問每個文件的欄位值是否包含著特定值
查詢語句會詢問每個文件的欄位值與特定值的匹配程度如何
重點:
做精確匹配搜尋時,你最好用過濾語句,因為過濾語句可以快取資料

** 過濾
1 term 過濾
term 主要用於精確匹配哪些值,比如數字,日期,布林值或 not_analyzed 的字串

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{ “term”: { “age”: 26 }}

精準查詢使用過濾器,過濾器的重要性在於它們非常的快。

過濾器順序
假如條件 A 匹配 1000 萬個文件,而 B 只匹配 100 個文件,那麼需要將 B 放在 A 前面。

term 過濾器本身並不能起作用,為了使用 term 過濾器,我們需要將它包含在一個過濾查詢語句中:
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“query”: {
“filtered”: { – filtered 查詢同時接受接受 query 與 filter
“query”: {
“match_all”: { } – match_all 用來匹配所有文件
},
“filter”: {
“term”: { – term 過濾器
“price”: 20
}
}
}
}
}

term過濾字串的時候,欄位需要為 not_analyzed

2 terms 過濾
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“terms”: {
“tag”: [ “search”, “full_text”, “nosql” ]
}
}

– 完整的,也要放在 filtered 查詢中
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“query”: {
“filtered”: {
“filter”: {
“terms”: {
“price”: [ 20, 30 ]
}
}
}
}
}

3 range 過濾
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“range”: {
“age”: {
“gte”: 20,
“lt”: 30
}
}
}

支援日期數學操作
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“range”: {
“timestamp”: {
“gt”: “now-1h” – 找出所有時間戳大於當前時間減 1 小時的文件
}
}
}

“2014-01-01 00:00:00||+1M” : 2014 年 1 月 1 號加一個月

4 exists 和 missing 過濾

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“exists”: {
“field”: “title”
}
}

只是針對已經查出一批資料來,但是想區分出某個欄位是否存在的時候使用

5 bool 過濾 來合併多個過濾條件查詢結果的布林邏輯
must :and
must_not :not
should :or

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“bool”: {
“must”: { “term”: { “folder”: “inbox” }},
“must_not”: { “term”: { “tag”: “spam” }},
“should”: [
{ “term”: { “starred”: true }},
{ “term”: { “unread”: true }}
]
}
}

** 查詢

1 match_all 查詢

2 match 查詢

match 查詢一個全文字欄位
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“match”: {
“tweet”: “About Search”
}
}

match 下指定了一個確切值
{ “match”: { “age”: 26 }}

3 multi_match 查詢

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“multi_match”: {
“query”: “full text search”,
“fields”: [ “title”, “body” ]
}
}

同時搜尋title 和 body 這2個欄位

4 bool 查詢 合併多個查詢子句

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“bool”: {
“must”: {
“match”: { “title”: “how to make millions” }
},
“must_not”: {
“match”: { “tag”: “spam”}
},
“should”: [
{ “match”: {“tag”: “starred” } },
{ “range”: { “date”: {“gte”: “2014-01-01”} } }
]
}
}

** 查詢與過濾條件的合併

1 帶過濾的查詢語句 , filtered 來同時包含 “query” 和 “filter” 子句
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“filtered”: {
“query”: {
“match”: { “email”: “business opportunity” }
},
“filter”: {
“term”: { “folder”: “inbox” }
}
}
}

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“filtered”: {
“query”: { “match_all”: {}}, – 查詢語句可以省略 相當於 match all
“filter”: {
“term”: { “folder”: “inbox” }
}
}
}

——————————-排序——————————–

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
GET /_search
{
“query”: {
“filtered”: {
“filter”: {
“term”: {“user_id”: 1 }
}
}
},
“sort”: {
“date”: { “order”: “desc” }
}
}

_score

多級排序
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
“sort”: [
{ “date”: { “order”: “desc” }},
{ “_score”: { “order”: “desc” }}
]

被分析器(analyser)處理過的字元稱為 analyzed field (譯者注:即已被分詞並排序的欄位,所有寫入ES中的欄位預設圴會被analyzed),
analyzed 字串欄位同時也是多值欄位,在這些欄位上排序往往得不到你想要的值。
比如你分析一個字元”fine old art”,它最終會得到三個值。
例如我們想要按照第一個詞首字母排序,如果第一個單詞相同的話,再用第二個詞的首字母排序,以此類推,
可惜ElasticSearch在進行排序時是得不到這些資訊的。

相關性
ElasticSearch的相似度演算法被定義為 TF/IDF,即檢索詞頻率/反向文件頻率

檢索詞頻率
檢索詞在該欄位出現的頻率,出現頻率越高,相關性也越高。
反向文件頻率
檢索詞在索引中出現的頻率,頻率越高,相關性越低。
檢索詞出現在多數文件中會比出現在少數文件中的權重更低

————————索引管理—————————
1 建立索引
簡單的通過新增一個文件的方式建立了一個索引。這個索引使用預設設定,新的屬性通過動態對映新增到分類中。
現在我們需要對這個過程有更多的控制:我們需要確保索引被建立在適當數量的分片上,在索引資料之前設定好分析器和型別對映。

禁止自動建立索引:
- config/elasticsearch.yml
- action.auto_create_index : false

2 刪除索引

3 索引設定
number_of_shards
定義一個索引的主分片個數,預設值是 5 。這個配置在索引建立後不能修改。

number_of_replicas
每個主分片的複製分片個數,預設是 1 。這個配置可以隨時在活躍的索引上修改。

4 配置分析器

standard 分析器 : 大部分西方語系
whitespace :
simple :
english :

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
“name”: {
“type”: “string”,
“analyzer”: “whitespace”
}

不同型別的文件可以被加到同一個索引裡

***動態對映

dynamic true 自動新增欄位(預設)
false 忽略欄位
strict 當遇到未知欄位時丟擲異常

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“mappings”: {
“my_type”: {
“dynamic”: “strict”, – 當遇到未知欄位時, my_type 物件將會丟擲異常
“properties”: {
“title”: {
“type”: “string”
},
“stash”: {
“type”: “object”,
“dynamic”: true – stash 物件會自動建立欄位
}
}
}
}
}

自定義動態對映

動態模板 **
使用 dynamic_templates ,你可以完全控制新欄位的對映,你設定可以通過欄位名或資料型別應用一個完全不同的對映。

例子

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“mappings”: {
“my_type”: {
“dynamic_templates”: [
{
“es”: { – 名稱
“match”: “*_es”, – 欄位名以 _es 結尾需要使用 spanish 分析器
“match_mapping_type”: “string”,
“mapping”: {
“type”: “string”,
“analyzer”: “spanish”
}
}
},
{
“en”: {
“match”: “*”, – 所有其他欄位使用 english 分析器。 匹配所有字串型別欄位
“match_mapping_type”: “string”,
“mapping”: {
“type”: “string”,
“analyzer”: “english”
}
}
}
]
}
}
}

match_mapping_type :允許你限制模板只能使用在特定的型別上 (例如 strong 和 long )

match :只匹配欄位名,
path_match :匹配欄位在一個物件中的完整路徑

default 預設對映

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
{
“mappings”: {
default“: {
“_all”: { “enabled”: false } – 對映對所有型別禁用 _all 欄位
},
“blog”: {
“_all”: { “enabled”: true } – 只在 blog 欄位上開啟 _all 欄位
}
}
}

default 對映也是定義索引級別的動態模板的好地方

重建索引

可以給索引新增新的型別,或給型別新增新的欄位,但是你不能新增新的分析器或修改已有欄位
但是可以通過重建索引來完成

—重點查詢中的聚合
統計每種興趣下職員的平均年齡

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
GET /megacorp/employee/_search

{
“aggs”: {
“all_interests”: {
“terms”: {
“field”: “interests”
},
“aggs”: {
“avg_age”: {
“avg”: {
“field”: “age”
}
}
}
}
}
}

基於短語(Term-based)的查詢
全文(Full-text)檢索

———-瞭解部分——————–

文件到分片

shard = hash(routing) % number_of_primary_shards

routing 一般是 _id 欄位

主分片的數量只能在建立索引時定義且不能修改,如果主分片的數量在未
來改變了,所有先前的路由值就失效了,文件也就永遠找不到了。

主分片 複製分片

master 請求節點

文件能夠從主分片或任意一個複製分片被檢索。

————-分散式搜尋—–瞭解即可-
查詢階段
取回階段

管理命令

檢視索引
[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl 192.168.1.201:9200/_cat/indices?v

刪除索引

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XDELETE ‘192.168.1.201:9200/razor_cd’

curl -XDELETE ‘192.168.1.201:9200/razor_event’

curl -XDELETE ‘192.168.1.201:9200/razor_usinglog’

curl -XDELETE ‘192.168.1.201:9200/razor_app’

curl -XDELETE ‘192.168.1.201:9200/razor_tag’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘192.168.1.201:9200/razor_cd/clientdata/_search?pretty=true’

curl -XGET ‘192.168.1.201:9200/razor_app/app_info/_search?pretty=true’

curl -XGET ‘192.168.1.201:9200/razor_tag/app_tag/_search?pretty=true’

curl -XGET ‘192.168.1.201:9200/razor_event/event/_search?pretty=true’

curl -XGET ‘192.168.1.201:9200/razor_usinglog/usinglog/_search?pretty=true’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘192.168.1.201:9200/razor_app/app_info/_search?pretty=true’ -d ’
{
“query”: {
“range”: {
“localtime”: {
“gte”: “2016-03-28 00:00:00”,
“lt”: “2016-03-28 10:08:00”
}
}
}
}’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘192.168.1.201:9200/razor_app/app_info/_search?pretty=true’ -d ’
{
“query”: {
“match”: {
“user_id”: “0c5ead1ca4bda378f0784440eda92700”
}
}
}’

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
curl -XGET ‘192.168.1.201:9200/razor_cd/clientdata/_search?pretty=true’ -d ’
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“user_id”: “a8013699209”
}
},
{
“match”: {
“product_id”: “10028147”
}
}
]
}
},
“sort”: {
“localtime”: {
“order”: “desc”
}
},
“from”: 0,
“size”: 100
}