在我的的實踐中,ElasticSearch是充當關係型數據庫來使用,將Mysql中數據過大的超過1000w的表存入ES中,因此使用的所有是確切詞查詢而非全文檢索,所以在本次ES的學習中忽略了與全文檢索相關如得分等相關特性,這些在後續的有關搜索引擎的實踐中會介紹。 sql
在這張腦圖中主要介紹的是搜索相關的一些機制。下面會對該圖作一些簡單的說明。數據庫
前文說過ES的操做都是基於JSON來控制的,那麼不論是簡單的查詢仍是複雜的查詢ES都是經過不一樣的JSON對象來實現的。
這裏只是簡單的說明,經過腦圖方便記憶,具體的操做能夠看ElasticSearch—— Java API緩存
查詢邏輯bash
搜索類型post
查詢執行的順序,方式等,默認的是query_then_fetch,此方式符合上述的查詢邏輯,如今全部分片上面進行查詢對文檔的排序和分級信息,而後再在相應的分片上面進行查詢實際的文檔。
還有一些其餘的類型如query_and_fetch,dfs_query_and_fetch,dfs_query_then_fetch等等,能夠在搜索時進行指定:性能
http://localhost:9200/index/search?pretty=true&search_type=query_and_fetch
複製代碼
搜索執行的偏好學習
控制查詢發生在主片仍是副本上面,由preference=xxxx指定fetch
http://localhost:9200/index/_search?preference=_primary
複製代碼
只在主分片上執行搜索,不使用副本。當想使用索引中最近更新的、還沒複製到副本 中的信息,這個是頗有用的。搜索引擎
ES中的查詢分不少種類,這邊說明幾種常見的使用方式spa
詞條查詢
它僅匹配在給定字段中含有該詞條的文檔,而 且是確切的、未經分析的詞條
{
"query" : {
"term" : {
"title" : "crime"
}
}
}
複製代碼
如上上述查詢將匹配title字段中含有crime一詞的文檔。記住,詞條查詢是未經分析的,所以需 要提供跟索引文檔中的詞條徹底匹配的詞條
而這種方式和傳統SQL中的"="(等值)語句效果同樣。
多詞條查詢
詞條查詢容許匹配單個未經分析的詞條,多詞條查詢能夠用來匹配多個這樣的詞條。
{
"query" : {
"terms" : {
"tags" : [ "novel", "book","hello" ],
"minimum_match" : 1
}
}
}
複製代碼
如上,上述查詢返回在tags字段中包含一個或兩個搜索詞條的全部文檔。爲何?這是由於咱們 把minimum_match屬性設置爲1;這意味着至少有1個詞條應該匹配。若是想要查詢匹配全部詞 條的文檔,能夠把minimum_match屬性設置爲2。
當minimum_match=1時就和SQL中的「in「語句相似了。
範圍查詢
範圍查詢使咱們可以找到在某一字段值在某個範圍裏的文檔,字段能夠是數值型,也能夠是基於字符串的(將映射到一個不一樣的Apache Lucene查詢),範圍查詢只能針對單個字段。
{
"query" : {
"range" : {
"year" : {
"gte" : 1700,
"lte" : 1900
}
}
}
}
複製代碼
找到year字段從1700到1900的全部圖書
相似SQL中的">","<",">=","<="
複合查詢就是支持能夠把多個查詢鏈接起來,或者改變其餘查詢的行爲。
布爾查詢
複合查詢就是支持能夠把多個查詢鏈接起來,或者改變其餘查詢的行爲 主要有以下幾種鏈接符。
{
"query" : {
"bool" : {
"must" : {
"term" : {
"title" : "crime"
}
},
"should" : {
"range" : {
"year" : {
"from" : 1900,
"to" : 2000
}
}
},
"must_not" : {
"term" : {
"otitle" : "nothing"
}
}
}
}
}
複製代碼
找到全部這樣的文檔:在title字段中含有crime詞條,而且year字段能夠在 也能夠不在1900~2000的範圍裏,在otitle字段中不能夠包含nothing詞條。
過濾器是能夠在查詢的結果中作過濾,好比在不影響最後分數的狀況下,選擇索引中的某個子集,就可使用過濾器。
通常來講應該儘量使用過濾器。過濾器不影響評分,而得分計算讓搜索變得複雜,並且須要CPU資源。另外一方面,過濾是一種相對簡單的操做。因爲過濾應用在整個索引的內容上,過濾的結果獨立於找到的文檔,也獨立於文檔之間的關係。過濾器很容易被緩存,從而進一步提升過濾查詢的總體性能。
過濾器發生在運行查詢以前,因此性能比較好,應該儘量的使用過濾器
{
"query": {
"filtered" : {
"query" : {
"match" : {
"title" : "Catch-22"
}
},
"filter" : {
"term" : {
"year" : 1961
}
}
}
}
}
複製代碼
在title字段搜索Catch-22並向其添加過濾器表示只要year=1961的文檔。
常見過濾器
未完待續!!!!!!