天天看點

Elasticsearch檢索文檔。

檢索單個員工的資訊。

        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>來辨別比對到的單詞。

繼續閱讀