Elastic Stack-Elasticsearch使用介紹(二)

來源:互聯網
上載者:User

一、前言

    寫部落格,更要努力寫部落格!

二、Mapping介紹

   Mapping類似於資料庫中的表結構的定義:這裡我們試想一下表結構定義需要那些:

   1.欄位和欄位類型,在Elasticsearch中的體現就是索引的結構,定義索引的欄位Field Name和欄位類型,上一篇有簡單介紹一下欄位有那些類型;

   2.索引,在資料庫中我們可以定義欄位索引,在Elasticsearch中就是相當於是否分詞,按照分詞器分詞;

   先來用我們的神器先自訂一個Mapping:

   

   接下來在在查詢下Mapping的結構:

  

 三、Mapping常用參數介紹

    type:指定參數的類型;

    analyzer:指定分詞器;

    boost:指定欄位的權重,

    copy_to:指定某幾個欄位合并;

   dynamic:欄位動態添加 ,有3種取值:

         true:無限制;

         false:資料可寫入但該欄位不保留;

         strict:無法寫入拋異常;

   format:"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" ,格式化 此參數代表可接受的時間格式 3種都接受;

   ignore_options:這個選項用於控制倒排索引記錄的內容,有4種配置:

         docs:只記錄文檔號;

         freqs:文檔號 + 詞頻;

         postions:文檔號 + 詞頻 + 位置;

         offsets:文檔號 + 詞頻 + 位置 + 位移量;

  index:指定某欄位是否被索引;

  fileds:可以對一個欄位提供多種索引模式;

  null_value:當欄位遇到null值時候的處理機制,預設為null空值,此時es會忽略該值,可以通過設定該值設定該欄位的預設值來改變null不顯示成空值:

  properties:嵌套屬性;

  search_analyzer:查詢分詞器;

  similarity:用於指定文檔評分模型,有2種配置:

       default:Elasticsearch和Lucene使用的預設TF / IDF演算法;

       BM25:Okapi BM25演算法;

  基本上常用就是這些,有沒有介紹到的大家可以參考官方文檔;

四、欄位的資料類型

  上上篇介紹過一些簡單的資料類型在官方稱為核心資料類型,這裡不做過多的介紹了,這裡主要介紹一下複雜的資料類型、地理資料類型、專用資料類型這3種;

  複雜的資料類型

  1.數組資料類型(Array datatype)

  Elasticsearch中沒有專門的數群組類型,預設情況下每個欄位都可以儲存0個或者多個值,但是這些值得類型必須是一樣的;

  2.對象資料類型(Object datatype)

  提交文檔的時候是Json文檔,內部的欄位可以嵌套Json對象;

  3.嵌套資料類型(Nested datatype)

  嵌套資料類型就是1+2的組合,數組裡面放Json;

  地理資料類型

  1.地理資料類型(Geo-point datatype)

  對經緯度的查詢搜尋;

  2.圖形資料類型(Geo-Shape datatype)

 對多邊形的的形狀的查詢;

 專用資料類型

 1.IP資料類型

 2.完整的資料類型

 提供search-as-you-type的搜尋,這個還是比較有用的大家可以參考下官方文檔;

 剩下的也使用不多,大家可以參考下官方文檔,這裡就不做過多介紹;

五、Search API介紹

 Search API實現了對Elasticsearch中儲存的資料進行查詢分析,通過_search方式去查詢,基本上有以下4種情況:

 

1.不指定索引的情況下查詢的是Elasticsearch中所有的資料;

2.指定index就是對單個的index查詢;

3.另外還可以指定多個索引;

4.還可以通過萬用字元的形式去匹配索引;

Search API查詢的方式主要有兩種:URL Search和Request Body Search,分別對以下兩種情況進行下介紹:

URL Search:

通過URL的形式指定Query參數實現搜尋,我們先來一個demo,然後介紹下常用下參數:

首先先添加些資料:

接下來進行下查詢

這樣就完成了ES查詢,接下來我們說說常用參數:

q:指定查詢的參數,也就是我們要搜尋的文檔的內容;

df:指定我們查詢文檔指定的欄位;

sort:指定排序的欄位;

form:第幾條開始;

size:一頁幾條;

剩下大家可以查看下官方文檔,

Request Body Search

這個是主要介紹的,也是我們經常使用的。主要是通過http requset body發送json請求去對Elasticsearch中儲存的資料進行查詢分析,有個比較專業的名詞Query DSL;主要有兩種類型欄位查詢和複合查詢,接下來我們介紹這兩種查詢的方式:

欄位查詢:

欄位查詢又可以分成兩類:全文匹配和單詞匹配;

全文匹配:

主要對text類型的欄位進行全文檢索索引,對查詢的語句先進行分詞,例如match、match_pharse等;

match Query

這個是我們經常使用的,接下來我們使用我們神器給大家展示以下怎麼使用;

首先看下person中有哪些欄位:

接下來看下使用的方式:

再看下匹配以後的類型,因為匹配到太多,我們用展示代碼的方式來展示:

{    "took": 12,    "timed_out": false,    "_shards": {        "total": 5,        "successful": 5,        "skipped": 0,        "failed": 0    },    "hits": {//匹配文檔的總數        "total": 4,//總數        "max_score": 0.80259144,//最匹配的得分        "hits": [//返迴文檔的總數            {                "_index": "person",                "_type": "doc",                "_id": "1",                "_score": 0.80259144,//文檔得分                "_source": {                    "name": "ww",                    "age": 18                }            },            {                "_index": "person",                "_type": "doc",                "_id": "7",                "_score": 0.5377023,                "_source": {                    "name": "wwcc waa",                    "age": 29                }            },            {                "_index": "person",                "_type": "doc",                "_id": "8",                "_score": 0.32716757,                "_source": {                    "name": "ww waa",                    "age": 29                }            },            {                "_index": "person",                "_type": "doc",                "_id": "9",                "_score": 0.32716757,                "_source": {                    "name": "ww waa",                    "age": 29                }            }        ]    }}
View Code

看完上面返回的文檔以後,可做如下推測查詢的過程就是將我們查詢的內容進行分詞然後在文檔中查詢匹配的分詞,因為文檔中不存在name等於waa這種情況,所以沒出現,如果不相信可以補一下這個文檔再看下返回結果,過程如:

可以通過設定operator參數來控制分詞間的匹配關係,預設是or,可以設定為and,當and的時候文檔種必須同時出現查詢的分詞;

還可以通過minimum_should_match參數設定需要匹配參數的個數;

另外我們還有一個關注的選項就是得分,上面我們說過文檔評分的模型有2種:TF/IDF和BM25,但是在介紹這個之前我們還需要知道4個概念:

1.Term Frequency(TF):詞頻,這個應該不陌生在上篇介紹倒排索引原理的時候介紹過這個概念;

2.Document Frequency(DF):文檔頻率,單詞在文檔中出現的頻率;

3.Inverse Document Frequency(IDF):逆向文檔頻率,與文檔頻率相反,可理解為1/DF。即單詞出現的文檔數越少,相關度越高。

4.Field-length Norm:文檔越短,相關度越高;

TF/IDF模型:

BM25模型

 推薦大家看下tf/idf評分演算法,另外可以通過explain參數來查看得分的計算方法;

 match_phrase Query

 必須包含查詢的欄位,並且順序不能亂;

{    "took": 5,    "timed_out": false,    "_shards": {        "total": 5,        "successful": 5,        "skipped": 0,        "failed": 0    },    "hits": {        "total": 3,        "max_score": 0.6135754,        "hits": [            {                "_index": "test",                "_type": "doc",                "_id": "8",                "_score": 0.6135754,                "_source": {                    "name": "ww waa",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "3",                "_score": 0.51623213,                "_source": {                    "name": "ww waa",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "9",                "_score": 0.50104797,                "_source": {                    "name": "ww waa sdsfds",                    "age": 25                }            }        ]    }}
View Code

 query_string Query

 query_string與Lucene查詢語句的文法結合非常嚴謹,允許在查詢中使用多個特殊條件關鍵字對多個欄位進行查詢,簡單的看下用法:

 預設可以指定一個列:

 

 指定多個列查詢

 

  simple_string Query

  simple_query_string查詢永遠不會拋出異常,並丟棄查詢的無效部分,使用+、|、-來代替AND、OR、NOT等等;

  

  我們常用的就是match和match_phrase,剩下的我感覺我是用的不多,大家可以看自己;

  單詞匹配:

  查詢語句作為整個單詞不進行分詞,主要有term、terms、range、prefix等;

  term和terms query

  單個單詞進行查詢:

  

  一次可以傳入多個單詞進行查詢

  

   range query

   主要是用來匹配某一範圍的值,比如日期、數實值型別等等,我們上面有個age類型我們來根據這個查詢下20-30歲的人:

   

   prefix query

   查詢某個欄位中以給定字首碼開始的文檔,比如我們想要查詢以ki開始的使用者欄位;

   

   比較常用的基本上就是這幾種,剩下可以查閱官方文檔;

   複合查詢(Compound queries):

   複合查詢就是組合多個查詢在一起或改變查詢行為,比較常用就是Constant Score Query和bool Query,剩下的大家可以查看官方文檔,根據自己需求去選擇自己想要的;

   constant_score Query

   在內部封裝一個查詢,將返回結果中每個文檔設定一個相同的得分;

   

{    "took": 4,    "timed_out": false,    "_shards": {        "total": 5,        "successful": 5,        "skipped": 0,        "failed": 0    },    "hits": {        "total": 3,        "max_score": 1.2,        "hits": [            {                "_index": "test",                "_type": "doc",                "_id": "8",                "_score": 1.2,                "_source": {                    "name": "ww waa",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "9",                "_score": 1.2,                "_source": {                    "name": "ww waa sdsfds",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "3",                "_score": 1.2,                "_source": {                    "name": "ww waa",                    "age": 25                }            }        ]    }}
View Code

    bool Query

    由一個或者多個布爾子句構成,主要包含以下4種類型:

    

   用法如下:

   

{    "took": 6,    "timed_out": false,    "_shards": {        "total": 5,        "successful": 5,        "skipped": 0,        "failed": 0    },    "hits": {        "total": 3,        "max_score": 1.6135753,        "hits": [            {                "_index": "test",                "_type": "doc",                "_id": "8",                "_score": 1.6135753,                "_source": {                    "name": "ww waa",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "3",                "_score": 1.5162321,                "_source": {                    "name": "ww waa",                    "age": 25                }            },            {                "_index": "test",                "_type": "doc",                "_id": "9",                "_score": 1.501048,                "_source": {                    "name": "ww waa sdsfds",                    "age": 25                }            }        ]    }}
View Code

   介紹minimum_should_match這個參數,當只有should,文檔中參數必須要要滿足條件的個數才會顯示,同時包含should和must時,文檔不滿足should中的條件,但是如果滿足條件會增加相關性得分:

   在強調一點Filter查詢只過濾複合條件的文檔,不會進行相關性算分;

六、結尾

   這篇文章寫了好久,下一篇再來好好聊聊Search機制,歡迎大家加群438836709,歡迎大家關注我公眾號:

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.