Elasticsearch java api 基本搜尋部分詳解

來源:互聯網
上載者:User

標籤:內容   tail   mat   missing   card   _for   detail   soc   簡單介紹   

著作權聲明:本文非原創文章,轉載出處:http://blog.csdn.net/molong1208/article/details/50512149

一、所使用版本的介紹

使用的是elasticsearch2.1.0版本,在此只是簡單介紹搜尋部分的api使用

二、簡單的搜尋

使用api的時候,基本上可以將DSL搜尋的所有情況均寫出來,在此給出一個最簡單搜尋的全部的過程以及代碼,之後將對不同的搜尋只是針對函數進行介紹

(1)DSL搜尋

對於最簡單的DSL搜尋,對一個詞進行搜尋使用url直接進行通訊,例如,如果對於一個欄位,搜尋具體的一個term或者query,DSL如下所示:

{“query”:{"term":{"title":"molong1208 blog"}}}

這個搜尋的含義是:在title欄位,搜尋內容為molong1208 blog;上面是DSL的寫法,實際上對於簡單的查詢,也可以直接使用url查詢,不帶json格式,假設我們所使用的伺服器ip是localhost,對於如上的查詢可以寫為: 

localhost:9200/index/type/_search? q=title:molong1208 blog

這個寫法與上邊的DSL語言是同樣的功能的,但是這種寫法只是一些簡單的查詢才可以用,例如顯示想要的欄位,按照某一欄位排序等

localhost:9200/index/type/_search? q=title:molong1208 blog&fields=name,title&sort=id:desc&pretty=true

上述url的意思就是在index/type裡面的title欄位搜尋內容,並且顯示的欄位為name以及title,按照id降序排序,輸出的格式為美化的json格式

(2)使用java api 實現簡單搜尋1、建立串連

Java api使用搜尋的時候,必須先進行串連,在直接url的時候是連接埠9200,但是在使用程式的時候為9300,如下所示,建立用戶端的串連,在connection類裡面給出初始化函數

 

[java] view plain copy  
  1. private static void open()  
  2.     {  
  3.             Settings settings = Settings.settingsBuilder()  
  4.                     .put("cluster.name", "molong").build();  
  5.                       
  6.             try {  
  7.                 client =  TransportClient.builder().settings(settings).build()  
  8.                         .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));  
  9.             } catch (UnknownHostException e) {  
  10.                 // TODO Auto-generated catch block  
  11.                 e.printStackTrace();  
  12.             }  
  13.   
  14.     }  
在此使用的是TransportClient串連,還有一個Nodeclient,沒使用過,在此不做介紹

 

2、進行查詢

查詢的時候,需要建立一個SearchRequestBuilder,這裡面將給出對於哪一個index或者type進行查詢,並且所有的設定都可以在這裡面進行實現,例如模糊查詢,範圍查詢,首碼查詢等

 

[java] view plain copy  
  1. SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type")  
上述代碼的意思是對於index的type進行查詢,其中client即使得到的建立連結,下一步就是要將查詢詞給進去

 

 

[java] view plain copy  
  1. SearchResponse myresponse=responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))  
  2. .setFrom(0).setSize(10).setExplain(true).execute().actionGet();  
上述代碼就是講所要查詢的詞塞進去,其中setfrom,setsize是指一頁顯示的多少,從第幾個開始,顯示size個資料

 

3、展示

 

[java] view plain copy  
  1. SearchHits hits = myresponse.getHits();  
  2. for (int i = 0; i < hits.getHits().length; i++) {  
  3.            System.out.println(hits.getHits()[i].getSourceAsString());}  

 

其中還可以使用hits.getHits()[i].getSource(),這是一個map的格式,可以將具體要展示的進行展示出來

三、搜尋時其他api的實現

讀DSL的時候我們可以看到,查詢有很多的查詢,比如說多域,比如說過濾等查詢條件,下面就針對Elasticsearch伺服器開發中一些基本查詢的DSL給出在Java api實現的一些形式,其中很多形式不同的之處只是上述塞查詢詞時候的setQuery裡面的不同,所以在此只是講述裡面的函數不同

(1)基本查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))  

 

所使用的是matchPhraseQuery(field,text)函數,這個函數的參數有兩個,其中對應text的部分是要解析的,例如,molong1208 blog 可能經過解析之後會解析成molong1208 以及blog然後再進行查詢的

 

(2)多詞條查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.termsQuery("title", "molong1208","blog","csdn"))  
對於三個詞molong1208,blog,csdn在title欄位進行查詢,如果有三者中的任意一個即算匹配

 

(3)match_all查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.matchAllQuery())  

 

(4)常用詞查詢

 

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.commonTermsQuery("name", "lishici"))  
可以在後面設定具體的cutoffFrequency

 

(5)match查詢

只使用過matchPhraseQuery函數,具體用法見上述所示

(6)multi_match查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))  
multiMatchQuery(text,fields)其中的fields是欄位的名字,可以寫好幾個,每一個中間用逗號分隔

 

(7)query_string查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.queryStringQuery(""))  
沒使用過這個查詢,所以對此查詢不是很熟悉,所對應的是Elasticsearch伺服器開發的3.3.7,具體使用的時候可以再深究如何使用

 

(8)simple_query_string查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.simpleQueryStringQuery(""))  
同上所示,3.3.8

 

(9)標識符查詢

個人理解應該是類似如下的查詢,具體請各位用的時候再次去研究具體哪一個

 

[java] view plain copy  
  1. GetResponse getresponse = client.prepareGet("users", "user", "3").get();  

 

(10)首碼查詢

 

 

[javascript] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.prefixQuery("title", "mo"))  
前一個參數為使用的field後一個參數為所使用的首碼詞

 

(11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.fuzzyQuery("title", "malong"))  
在所使用的版本,沒發現如何使用fuzzy_like_this以及fuzzy_like_this_field的函數,不清楚是否有這個功能,只發現有fuzzy查詢,後面可以設定boost等值

 

(12)萬用字元查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.wildcardQuery("title", "molo?g"))  

 

(13)more_like_this,more_like_this_field

 

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))  
[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))  
有兩個方法,其中第二個是在_all範圍內進行查詢,第一個後面還有很多可以設定,有需要用的可以具體參考

 

(14)rang查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.rangeQuery("age").gt(10).lt(20))  
對於某一個field,大於多少,小於多少

 

(15)dismax查詢

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.disMaxQuery().add(QueryBuilders.termQuery("title", "molong1208")))  

 

(16)Regex查詢

 

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))  

 

四、bool查詢

 

上述只是大概給出了具體的查詢方式,有些時候可能我們所想要的為比較複雜的查詢,例如想要查一個在某個欄位必須有某個值,並且另一個欄位必須有另外一個值的情況,這種時候就可以使用bool查詢,例如下所示

 

[java] view plain copy  
  1. responsebuilder.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.multiMatchQuery(query, "name","title","title_1")).must(QueryBuilders.multiMatchQuery(query2, "title2","title3")))  

 

上述的意思是,在title或者title_1或者name欄位有query,並且在title2或者title3欄位有query2的結果召回來

當然,可以根據自己的情況,有should,must_not等選擇

五、過濾器

在使用過濾的時候,版本2.1.0僅僅有postfilter,例如

 

[java] view plain copy  
  1. responsebuilder.setPostFilter(QueryBuilders.existsQuery("title"))  
表示的就是exists過濾,對有title欄位的過濾,個人是這麼理解的,可能有誤

 

 

[java] view plain copy  
  1. responsebuilder.setPostFilter(QueryBuilders.missingQuery("title"))  

這個的意義與上面的完全不同,可以參考Elasticsearch伺服器開發具體章節的介紹

且postfilter為對結果級進行過濾即搜尋出來的結果,對結果進行過濾的,可以理解為後置的過濾器,es大部分都是先過濾後彙總,這個可以設定為先彙總後過濾

 

Elasticsearch java api 基本搜尋部分詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.