ElastriSearch一些查詢語句

Elastic search(構建於Lucene之上)在一個容易管理的包中提供了高性能的全文搜索功能,支持開箱即用地集羣化擴展。能夠經過標準的REST API或從特定於編程語言的客戶端庫與Elasticsearch進行交互。數據庫

一、首先了解一下es的主要構成:編程

①索引(index)我的能夠理解爲關係型數據庫的庫app

②類型(type)我的能夠理解爲關係型數據庫的表編程語言

③文檔(document)我的能夠理解爲關係型的惟一主鍵性能

二、es一些關鍵詞code

query下面能夠加xml

②bool      布爾值索引

③must     至關因而關係型數據庫的andci

④filter      和bool的做用差很少,可是filter的查詢效率更高文檔

⑤term      指定的要查詢的某個字段

agg 下面能夠加

①term                   指定的字段

②agg                    至關因而關係型數據庫的groupby

③cardinality           去重至關因而關係型的distinct

④sum max min 

等等

三、去重例子,在kibana執行以下

GET antifraud_enriched_prod-2017.06.17/_search
{
  "size": 0
  , "aggs": {
    "res_distinct": {
      "cardinality": {
        "field": "unstruct_event_com.cid"
        , "precision_threshold": 40000
      }
    }
  }
, "query": {
  "bool": {
    "must": [
      {
      "range": {
        "derived_tstamp": {
          "gte": "2017-06-17T10:49:46.685Z",
          "lte": "2017-06-17T10:51:46.685Z"
        }
      }
      }
    ]
  }
 }
}

執行以下:

field表明是存放在es的字段,這個字段我在mapping的時候沒有分詞,若是分詞的話要在field後面加上.raw

右邊total表明的是返回值,res_distinct表明的是根據cid去重後的結果

es的distinct自己是存在問題的,precision_threshold:指定的去重範圍,若是查出來的數據超出了你指定的這個範圍,查出來的數據就是有點不許確了,默認好像是100

四、指定字段查詢

①一種查法:bool

GET  antifraud_enriched_prod-2017.06.18/_search
{
  "size": 0, 
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "event_name": {
              "value": "login"
            }
          }
        }
      ]
    }
  }
}

執行結果:

②另外一種查法:filter

GET  antifraud_enriched_prod-2017.06.18/_search
{
  "size": 0, 
 "query": {
   "filtered": {
     "query": {
       "match_all": {}
     },
     "filter": {
       "term": {
         "event_name": "login"
       }
     }
   }
 }
}

執行結果

五、agg的例子

GET antifraud_enrich-2017.06a/_search
{
  "size": 0, 
  "aggs": {
    "mobile_city": {
      "terms": {
        "field": "unstruct_event_com_xhqb.mobileCity"
       , "size": 5
      }
      , "aggs": {
        "avg": {
          "sum": {
            "field": "unstruct_event_com_xhqb.loanAmount"
          }
        }
      }
    }
  }
  , "query": {
    "bool": {
      "must": [
        {
          "range": {
            "derived_tstamp": {
              "gte": "2017-06-01T10:25:23.947Z",
              "lte": "2017-06-01T10:28:23.947Z"
            }
          }
        }
      ]
    }
  }
}

執行結果:

其中結果:sum_other_doc_count 表明是groupby mobilcity字段的結果,key是sum_other_doc_count  的前提後groupby loanmount字段的結果

注意通常使用agg的話不要指定size=0,若是這樣的話,數據會所有刷出kibana,數據量過大的話,kibana直接掛掉,曾經出現過這些問題

五、地理位置查詢

GET antifraud_enrich-2017.06a/_search
{
  "size": 0, 
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "event_name": {
              "value": "app_apply"
            }
          }
        },{
          "range": {
            "collector_tstamp": {
              "gte": "2017-06-17T09:02:26.548",
              "lte": "2017-06-17T09:22:26.548"
            }
          }
        },{
            "geo_distance" : {
        "unstruct_event_com_xhqb_app_apply_1.geolocation" : [ 121.499754782832099, 31.267086143900748 ],
        "distance" : "1.0km"
      }
        }
      ]
    }
  }
}

查詢結果

其中geolocation是地理位置字段, distance是1km的範圍內,也就是說這個點的一千米範圍裏查出來有幾個,這個字段比較特殊必定要是geo_point類型的,看例子

今天先寫到這裏

相關文章
相關標籤/搜索