ElasticSearch——搜索機制

在我的的實踐中,ElasticSearch是充當關係型數據庫來使用,將Mysql中數據過大的超過1000w的表存入ES中,因此使用的所有是確切詞查詢而非全文檢索,所以在本次ES的學習中忽略了與全文檢索相關如得分等相關特性,這些在後續的有關搜索引擎的實踐中會介紹。 sql

在這張腦圖中主要介紹的是搜索相關的一些機制。下面會對該圖作一些簡單的說明。數據庫

簡單查詢

前文說過ES的操做都是基於JSON來控制的,那麼不論是簡單的查詢仍是複雜的查詢ES都是經過不一樣的JSON對象來實現的。
這裏只是簡單的說明,經過腦圖方便記憶,具體的操做能夠看ElasticSearch—— Java API緩存

查詢過程

  • 查詢邏輯bash

    1. 發散階段:
    2. 收集階段:
  • 搜索類型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中的">","<",">=","<="

複合查詢

複合查詢就是支持能夠把多個查詢鏈接起來,或者改變其餘查詢的行爲。

  • 布爾查詢

    複合查詢就是支持能夠把多個查詢鏈接起來,或者改變其餘查詢的行爲 主要有以下幾種鏈接符。

    1. must :被它封裝的布爾查詢必須被匹配,文檔纔會返回 相似"and"
    2. should :被它封裝的布爾查詢可能被匹配,也可能不被匹配 相似"or"
    3. must_not:被它封裝的布爾查詢必須不被匹配,文檔纔會返回 相似 "!="
{
    "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的文檔。
常見過濾器

  • term過濾器
  • terms過濾器
  • and過濾器
  • or過濾器
  • bool過濾器 ······

未完待續!!!!!!

相關文章
相關標籤/搜索