Elasticsearch檢索文件。

孤芳不自賞發表於2017-08-31

檢索單個員工的資訊。

        HTTP GET請求並指出文件的“地址”——索引、型別和ID即可。根據這三部分資訊,我們就可以返回原始JSON文件:

        GET /megacorp/employee/1

        注意:我們通過HTTP GET 來檢索文件,同樣的,我們可以使用 DELETE 方法刪除文件,使用 HEAD 方法檢查某文件是否存在。如果想更新已存在的文件,我們只需再 PUT 一次。


簡單搜尋

搜尋全部員工的請求。

        GET /megacorp/employee/_search

        響應內容的 hits 陣列中包含了我們所有的文件。預設情況下搜尋會返回前10個結果。

        注意:響應內容不僅會告訴我們哪些文件會被匹配到,而且這些文件內容完整的被包含在其中——我們在給使用者展示搜尋結果時需要用到的所有資訊都有了。


搜尋姓氏為“Smith”的員工。

        要做到這一點,我們將在命令列中使用輕量級的搜尋方法,這種方法常被稱為查詢字串(query string)搜尋,因為我們像傳遞URL引數一樣去傳遞查詢語句:

        GET /megacorp/employee/_search?q=last_name:Smith


使用DSL語句查詢

        查詢字串搜尋便於通過命令列完成特定(ad hoc)的搜尋,但是它也有侷限性。Elasticsearch提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL)。他允許你構建    更加複雜、強大的查詢。DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現。

搜尋姓氏為“Smith”的員工。

        GET /megacorp/employee/_search

        {

              "query" : {

                        "match" : {

                                "last_name" : "Smith"

                        }

               }

        }

       這會返回與之前查詢相同的結果。你可以看到有些東西改變了,我們不再使用查詢字串(query String)作為引數,而是使用請求體代替。這個請求使用JSON表示。


更復雜的搜尋

搜尋姓氏為“Smith”的員工,並且年齡大於30歲的員工。

        GET /megacorp/employee/_search

        {

            "query" : {

                  "filtered" : {

                       "filter" : {

                           "range" : {

                              "age" : { "get" : 30}      <1>

                           }

                       },

                       "query" : {

                               "match" : {

                                    "last_name" : "smith"       <2>

                                }

                        }

                   }

             }

         }

  • <1>這部分查詢屬於區間過濾器(range filter),它用於查詢所有年齡大於30歲的資料——gt為“greater than”的縮寫。
  • <2>這部分查詢與之前的match語句(query)一致。


全文搜尋

        到目前為止搜尋都很簡單:搜尋特定的名字,通過年齡篩選。讓我們嘗試一種更高階的搜尋,全文搜尋——一種傳統資料庫很難實現的功能。

搜尋所有喜歡“rock climbing”的員工。

         GET /megacorp/employee/_search {

              "query" : {

                    "match" : {

                       "about" : "rock climbing"

                    }

               }

          }

        注意:響應內容的 hits 陣列中的欄位 "_score" 是結果相關性評分。

        預設情況下,Elasticsearch根據結果性評分來對結果集進行排序,所謂的“結果相關性評分”就是文件與查詢條件的匹配程度。很顯然,排名第一的 John Smith 的 about 欄位明確的寫到“rock climbing”。

        但是為什麼 Jane Smith也會出現在結果裡呢?原因是“rock”  在她的 about欄位中被提及了。因為只有“rock”被提及而“climbing”沒有,所以她的 _score 要低於 John。

        這個例子很好地解釋了Elasticsearch如何在各種文字欄位中進行全文搜尋,並且返回相關性最大的結果集。相關性(relevance)的概念在Elasticsearch中非常重要,而這個概念在傳統關係型資料庫中是不可想象的,因為傳統資料庫對記錄的查詢只有匹配或者不匹配。


短語搜尋。

        目前我們可以在欄位中搜尋單獨的一個詞,這挺好的,但是有時候你想要確切的匹配若干個單詞或者短語(phrases)。

查詢同時包含“rock”和“climbing”(並且是相鄰的)的員工記錄。

        GET /megacorp/employee/_search

        {

                  "query" : {

                        "match_phrase" :  {

                             "about" : "rock climbing"

                         }

                  }

         }


高亮我們的搜尋

        很多應用喜歡從每個搜尋結果中高亮(highlight)匹配到的關鍵字,這樣使用者可以知道為什麼這些文件和查詢相匹配。在Elasticsearch中高亮片段是非常容易的。

        讓我們在之前的語句上增加 highlight 引數

       GET /megacorp/employee/_search
      {

         "query" : {

                 "match_phrase" : {

                       "about" : "rock climbing"

                  }

         },

         "highlight" : {

                    "fields" : {

                        "about" : {}

                      }

           }

      }

      當我們執行這個語句時,會命中與之前相同的結果,但是在返回結果中會有一個新的部分叫做 highlight,這裡包含了來自about 欄位中的文字,並且用 <em></em>來標識匹配到的單詞。

相關文章