ES elasticsearch利用url查詢


准備好數據
為了說明問題的方便,我們首先在 Kibana 中使用如下的 bulk 指令來創建我們的 twitter 索引。

POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"張三","message":"今兒天氣不錯啊,出去轉轉去","uid":2,"age":20,"city":"北京","province":"北京","country":"中國","address":"中國北京市海淀區","location":{"lat":"39.970718","lon":"116.325747"}, "DOB":"1980-12-01"}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"老劉","message":"出發,下一站雲南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中國","address":"中國北京市東城區台基廠三條3號","location":{"lat":"39.904313","lon":"116.412754"}, "DOB":"1981-12-01"}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中國","address":"中國北京市東城區","location":{"lat":"39.893801","lon":"116.408986"}, "DOB":"1982-12-01"}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"老賈","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中國","address":"中國北京市朝陽區建國門","location":{"lat":"39.718256","lon":"116.367910"}, "DOB":"1983-12-01"}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中國","address":"中國北京市朝陽區國貿","location":{"lat":"39.918256","lon":"116.467910"}, "DOB":"1984-12-01"}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"老吳","message":"好友來了都今天我生日,好友來了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中國","address":"中國上海市閔行區","location":{"lat":"31.175927","lon":"121.383328"}, "DOB":"1985-12-01"}
這里總共有6條數據。

 

下面,我們來進行一些查詢的動作。

搜索數據
首先,我們做一個簡單的搜索,我們可以在瀏覽器中打入如下的命令:

GET twitter/_search?q=user:張三


我們通過 “q=user:張三” 查詢到我們所需要的文檔。在有的時候這是一種非常快的查詢方式。我們也可以在瀏覽器中直接打入一個這樣的 URI:

http://localhost:9200/_search?q=user:%E5%BC%A0%E4%B8%89&pretty


或者在命令行中:

 

下面,我們將使用 Kibana 來展示使用 URI 搜索的一些最基本的特點。

URI 查詢使用語法根據運算符(例如 OR,AND 或 NOT)解析和拆分提供的查詢字符串

我們想使用 sort 來對數據進行排序:

GET twitter/_search?q=city:"北京"&sort=DOB:desc


上面顯示了所有來自北京的用戶,並按照出生年月降序排列。

假如我們只想在 _source 里顯示年齡,DOB 及城市信息,我們可以這么做:

GET twitter/_search?q=city:"北京"&sort=DOB:desc&_source=city,age,DOB


從上面的顯示可以看出來,我們只看到有三個字段顯示出來。加入我們想分頁,每個頁只有2個文檔,那么我們可以這么做:

GET twitter/_search?q=city:"北京"&sort=DOB:desc&_source=city,age,DOB&size=2


從上面的顯示上我們可以看出來,只有兩個文檔被顯示出來盡管總共有5個文檔滿足條件。

假如這個時候,我們想對 city 為 “上海” 和 “北京” 的所有用戶都來統計一下,那么我們可以使用如下的語句:

GET twitter/_search?q=city:("北京" or "上海") &sort=DOB:desc&_source=city,age,DOB&size=2


顯然這個時候,我們得到了6條數據。上海和北京的所有用戶都被搜索出來了。

假如我們想查詢來自“北京”並且名字叫做 “張三” 的文檔,那么我們可以這么查詢:

GET twitter/_search?q=city:"北京" AND user:"張三


從上面可以看出來就只有一條數據。

假如我們想得到來除了上海以外地區的所有的用戶,那么我們可以使用如下的方法來得到:

GET twitter/_search?q=NOT city:"上海"


我們看到了5個數據。

我們也可以對某些想進行加權,以使得它們能夠排在更前面,比如:

 

上面的查詢是尋找年齡是20歲的,或者是來自上海的人。從搜索的結果來看,我們可以看到上海的老吳是排在前面。如果我們想對年齡為20歲的人需要有更多的關注,那么我們可以對它們的搜索結果進行加權,這樣會使得它們的分數更高。我們可以采用如下的方法來做:

GET twitter/_search?q=(age:20^5 OR city:"上海")
在上面,我們顯然對age為20的這個選項進行了加權。那么搜索后的結果為:

 

我們可以看到現在 age 為20歲的張三排到了搜索結果的前面。

假如我們不指定任何的 field 的話,那么這個搜索將對所有的 field 都進行:

GET twitter/_search?q=張三


當然我們也可以進行 fuzzy搜索:

 

上面標明有一個 edit 錯誤也可以被搜索出來。對於中文的檢索,這個依賴於分詞器。在我們的實驗中沒有使用具體的分詞器。這個和實際的使用可能會有區別。

我們也可以對一下范圍進行搜索:

GET twitter/_search?q=age:[20 TO 30]


上面搜索的結果是從20歲到30歲的所有的結果,並且都包含在里面。我們如果不想包含30歲的話,那么可以寫成這樣的格式:

 

我們使用 [20 TO 30}, 如果我們想搜索在30歲一下的所有文檔,那么我們可以使用如下的搜索方式:

在這里,我們使用[* TO 30},這里不包含30。

好了今天就講到這里。這里的所有的語法也適用於在 Kibana 中的 Search Bar。如果我們熟練地掌握了這些,也可以很方便地讓我們熟練地操作 Kibana 中搜索。
原文鏈接:Elastic 中國社區官方博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM