ElasticSearch 搜索使用

ElasticSearch爲Java用戶提供了兩種內置客戶端:

1.節點客戶端:以無數據節點身份加入集羣,(無數據節點的含義就是不存儲任何數據)但他知道數據在集羣中的具體位置,並能直接轉發請求到對應節點上。

2.傳輸客戶端:不加入集羣,只是簡單轉發請求給集羣中的節點。

兩個客戶端都通過9300端口與集羣交互。集羣中的節點之間也通過9300端口通信。

一個節點是一個單一的服務器,是集羣的一部分,存儲數據,並且參與集羣的索引和搜索功能。通過配置特定的集羣名稱來加入特定的集羣。

一個集羣是由一個或多個節點(服務器)組成的。 一個集羣中只有一個節點是有效的並且是非常好的。

向Elasticsearch發出的請求的組成部分與其它普通的HTTP請求是一樣的:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
  • VERB HTTP方法:GET, POST, PUT, HEAD,DELETE

  • PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)

  • HOST Elasticsearch集羣中的任何一個節點的主機名,如果是在本地的節點,那麼就叫localhost

  • PORT Elasticsearch HTTP服務所在的端口,默認爲9200

  • PATH API路徑(例如_count將返回集羣中文檔的數量),PATH可以包含多個組件,例如_cluster/stats或者_nodes/stats/jvm

  • QUERY_STRING一些可選的查詢請求參數,例如?pretty參數將使請求返回更加美觀易讀的JSON數據

  • BODY 一個JSON格式的請求主體(如果請求需要的話)

1.索引

Elasticsearch是面向文檔(document oriented)的,它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。

在elasticSearch中存儲數據的行爲叫做索引(index)(數據庫),每個文檔歸屬於類型(type)(表)。每一個類型包含多個文檔(document)(記錄、行),每個文檔包含多個字段(field)(字段)。

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices(對應數據庫) -> Types(對於數據表) -> Documents(對應表的記錄) -> Fields(字段)

在elasticSearch中“索引”的含義:

  • 類似於傳統關係數據庫的數據庫名稱

  • 類似於數據庫中的insert關鍵字。

  • 倒排索引,類似於數據庫中的特定列的索引。

eg:創建員工目錄:爲每個員工的文檔建立索引user,每個文檔的類型爲employee,索引存儲在ElasticSearch集羣中 。

path:PUT /megacorp/employee/1

{
"first_name" : "李",
"last_name" : "爾",
"age" : 25,
"about" : "我喜歡爬山、游泳",
"interests": [ "運動", "音樂" ]
}

path包含三部分信息:

名字

說明

megacorp

索引名

employee

類型名

1

這個員工的ID

在目錄中加入更多員工信息。

2.檢索文檔

  • 索引過程已經存儲了一些數據,體驗elasticSearch檢索單個員工的信息。 執行HTTP GET請求並指出文檔的“地址”——索引、類型和ID既可。

GET /megacorp/employee/1

  • 在結尾使用關鍵字_search來取代原來的文檔ID。響應內容的hits數組中包含了我們所有的三個文檔。默認情況下搜索會返回前10個結果

GET /megacorp/employee/_search

  • 查詢字符串查詢(參數在url中)

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

  • 使用DSL語句查詢(參數使用json格式傳遞)

GET /megacorp/employee/_search

{
    "query" : {
        "match" : {
        "last_name" : "爾"
         }
     }
}

複雜的搜索之添加搜索過濾器

eg:得到年齡大於22歲的員工(大於:gt,小於:lt)

GET /megacorp/employee/_search

{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 22 }
            }
      },
    "query" : {
        "match" : {
            "last_name" : "爾"
                }
            }
        }
    }
}

全文搜索。按照文檔與查詢條件的匹配程度排序並返回結果集。傳統數據庫中,只有匹配不匹配,沒有匹配查詢。

GET /megacorp/employee/_search

{
    "query" : {
        "match" : {
            "about" : "爬"
        }
    }
}

短語搜索。只要將match查詢變更爲match_phrase查詢即可。 查詢同時包含"遊"和"泳"(並且是相鄰的)的員工記錄

GET /megacorp/employee/_search

{
       "query" : {
            "match_phrase" : {
                "about" : "游泳"
        }
     }
}

聚合。類似於數據庫的group by(要先開啓text類型)。

開啓text類型

POST /megacorp/employee/

{
  "properties": {
    "interest": {
      "type":"text",
      "fielddata":true
    }
  }
}

找到所有職員中最大的共同點(興趣愛好)是什麼

GET /megacorp/employee/_search

{

    "aggs": {

        "all_interests": {

            "terms": { "field": "interests" }

        }

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章