Elasticsearch
1.建立連接
- java api使用搜索的時候,必須先進行連接,在直接url的時候是端口9200,但是在使用程序的時候為9300,如下所示,建立客戶端的連接,在connection類里面給出初始化函數
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進行查詢,并且所有的設置都可以在這里面進行實現,例如模糊查詢,范圍查詢,前綴查詢等
SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type")
- 上述代碼的意思是對于index的type進行查詢,其中client即使得到的建立鏈接,下一步就是要將查詢詞給進去
SearchResponse myresponse=responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog")).setFrom(0).setSize(10).setExplain(true).execute().actionGet();
- 上述代碼就是講所要查詢的詞塞進去,其中setfrom,setsize是指一頁顯示的多少,從第幾個開始,顯示size個數據
3.展示
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的格式,可以將具體要展示的進行展示出來
3.展示
- 讀DSL的時候查詢有很多的查詢,比如說多域,比如說過濾等查詢條件,其中很多形式不同的之處只是上述塞查詢詞時候的setQuery里面的不同,所以在此只是講述里面的函數不同
1.基本查詢
responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208"))
tiele:為Elastic中索引字段 molong1208:為需要查詢的東西
2.多條件查詢
responsebuilder.setQuery(QueryBuilders.termsQuery("title", "molong1208","blog","csdn"))
molong1208,blog,csdn在title字段進行查詢,如果有三者中的任意一個即算匹配
- match_all查詢(匹配所有)
responsebuilder.setQuery(QueryBuilders.matchAllQuery())
4.常用詞查詢
responsebuilder.setQuery(QueryBuilders.commonTermsQuery("name", "lishici"))
與1. 基本查詢matchPhraseQuery(String name, Object text)類似
- multi_match查詢
responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))
multiMatchQuery(text,fields)其中的fields是字段的名字,可以寫好幾個,每一個中間用逗號分隔
- multi_match查詢
responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))
multiMatchQuery(text,fields)其中的fields是字段的名字,可以寫好幾個,每一個中間用逗號分隔
- rang查詢
responsebuilder.setQuery(QueryBuilders.rangeQuery("age").gt(10).lt(20))
對于某一個field,大于多少,小于多少
- 正則表達式查詢
responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))
- bool查詢
- 有些時候可能我們所想要的為比較復雜的查詢,例如想要查一個在某個字段必須有某個值,并且另一個字段必須有另外一個值的情況,這種時候就可以使用bool查詢
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的結果召回來