Elasticsearch java api 基本搜索部分詳解
版權聲明:本文非原創文章,轉載出處: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
- private static void open()
- {
- Settings settings = Settings.settingsBuilder()
- .put("cluster.name", "molong").build();
- try {
- client = TransportClient.builder().settings(settings).build()
- .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
2、進行查詢
查詢的時候,需要建立一個SearchRequestBuilder,這裏面將給出對於哪一個index或者type進行查詢,並且所有的設置都可以在這裏面進行實現,例如模糊查詢,範圍查詢,前綴查詢等
[java] view plain copy
- SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type")
[java] view plain copy
- SearchResponse myresponse=responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))
- .setFrom(0).setSize(10).setExplain(true).execute().actionGet();
3、展示
[java] view plain copy
- SearchHits hits = myresponse.getHits();
- for (int i = 0; i < hits.getHits().length; i++) {
- System.out.println(hits.getHits()[i].getSourceAsString());}
其中還可以使用hits.getHits()[i].getSource(),這是一個map的格式,可以將具體要展示的進行展示出來
三、搜索時其他api的實現
讀DSL的時候我們可以看到,查詢有很多的查詢,比如說多域,比如說過濾等查詢條件,下面就針對Elasticsearch服務器開發中一些基本查詢的DSL給出在Java api實現的一些形式,其中很多形式不同的之處只是上述塞查詢詞時候的setQuery裏面的不同,所以在此只是講述裏面的函數不同
(1)基本查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))
所使用的是matchPhraseQuery(field,text)函數,這個函數的參數有兩個,其中對應text的部分是要解析的,例如,molong1208 blog 可能經過解析之後會解析成molong1208 以及blog然後再進行查詢的
(2)多詞條查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.termsQuery("title", "molong1208","blog","csdn"))
(3)match_all查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.matchAllQuery())
(4)常用詞查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.commonTermsQuery("name", "lishici"))
(5)match查詢
只使用過matchPhraseQuery函數,具體用法見上述所示
(6)multi_match查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))
(7)query_string查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.queryStringQuery(""))
(8)simple_query_string查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.simpleQueryStringQuery(""))
(9)標識符查詢
個人理解應該是類似如下的查詢,具體請各位用的時候再次去研究具體哪一個
[java] view plain copy
- GetResponse getresponse = client.prepareGet("users", "user", "3").get();
(10)前綴查詢
[javascript] view plain copy
- responsebuilder.setQuery(QueryBuilders.prefixQuery("title", "mo"))
(11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.fuzzyQuery("title", "malong"))
(12)通配符查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.wildcardQuery("title", "molo?g"))
(13)more_like_this,more_like_this_field
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))
- responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))
(14)rang查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.rangeQuery("age").gt(10).lt(20))
(15)dismax查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.disMaxQuery().add(QueryBuilders.termQuery("title", "molong1208")))
(16)正則表達式查詢
[java] view plain copy
- responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))
四、bool查詢
上述只是大概給出了具體的查詢方式,有些時候可能我們所想要的為比較復雜的查詢,例如想要查一個在某個字段必須有某個值,並且另一個字段必須有另外一個值的情況,這種時候就可以使用bool查詢,例如下所示
[java] view plain copy
- 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
- responsebuilder.setPostFilter(QueryBuilders.existsQuery("title"))
[java] view plain copy
- responsebuilder.setPostFilter(QueryBuilders.missingQuery("title"))
這個的意義與上面的完全不同,可以參考Elasticsearch服務器開發具體章節的介紹
且postfilter為對結果級進行過濾即搜索出來的結果,對結果進行過濾的,可以理解為後置的過濾器,es大部分都是先過濾後聚合,這個可以設置為先聚合後過濾
Elasticsearch java api 基本搜索部分詳解