這里簡(jiǎn)單記錄一下elasticsearch java api 的調(diào)用笤虫。
首先淳玩,初始化一個(gè)client.
public TransportClient initClient() {
Settings settings = Settings.settingsBuilder().put("cluster.name", cluster)
.put("client.transport.ignore_cluster_name", false).put("node.client", true)
.put("client.transport.sniff", true).build();
TransportClient client = null;
try {
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.0.70"), 9300));
if (client == null) {
LOGGER.info("Init Elasticsearch client failed!");
} else {
LOGGER.info("Init Elasticsearch client successul!");
}
} catch (UnknownHostException e) {
LOGGER.error("client initlization failed!");
LOGGER.error(e.toString());
}
return client;
}
初始化client的時(shí)候記得加上cluster直撤,這個(gè)表示你elasticsearch的cluster,可以在配置文件里面找到,如果你elasticsearch安裝了head插件蜕着,直接可以在網(wǎng)頁(yè)上看到谋竖。
然后红柱,可以加上你的定制條件進(jìn)行查詢。
res = client.prepareSearch(index).setTypes().setQuery(query).setPostFilter(filter)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setFrom(from).setSize(count).setExplain(true)
.execute().actionGet();
關(guān)于查詢可以定制一個(gè) setQuery(QueryBuilder) 和 setPostFilter(filter) 蓖乘。當(dāng)然還可以根據(jù)需要添加排序锤悄,分頁(yè)等參數(shù)。這里主要談一下query和filter.
query的作用是根據(jù)條件創(chuàng)建搜索規(guī)則嘉抒。
postFilter的作用是在搜索的結(jié)果的基礎(chǔ)上過(guò)濾結(jié)果零聚。
elasticSearch 2.4 以后沒(méi)有filter相關(guān)概念,所以構(gòu)建query和filter都用QueryBuilder些侍。簡(jiǎn)單舉幾個(gè)例子
QueryBuilder query = QueryBuilders.matchAllQuery(); //全部查詢
QueryBuilder query = QueryBuilders.queryStringQuery(key);
//filter
QueryBuilder timeFilter = QueryBuilders.rangeQuery("doc.create_time").from(begin_time).to(end_time);
QueryBuilder channelFilter = QueryBuilders.termsQuery("doc.channel", channel_list);
elasticsearch提供了boolQuery來(lái)代替filter的or, and, not等操作隶症。如果想要把上面的filter關(guān)聯(lián)起來(lái)需要用must, mustNot, should等操作。
filter = QueryBuilders.boolQuery().must(timeFilter).must(channelFilter);
must可以理解為and, mustNot可理解為not, 但should不能理解為or岗宣,這個(gè)對(duì)查詢的結(jié)果相關(guān)性有影響蚂会。
elasticsearch post filter可以作簡(jiǎn)單的yes/not過(guò)濾,但是無(wú)法對(duì)復(fù)查結(jié)果進(jìn)行過(guò)濾狈定,至少我沒(méi)發(fā)現(xiàn)颂龙。比如下面這種情況。
- 我有兩種類型的文檔纽什,type =1/2;
- 我不要兩天以外的type=1的文檔躲叼;
QueryBuilder typeFilter = QueryBuilders.termQuery("doc.media_type", 2);
QueryBuilder timeFilter = QueryBuilders.rangeQuery("doc.create_time").lt(TimeUtil.getDaysBefore(2));
QueryBuilder wFilters = QueryBuilders.boolQuery().must(typeFilter).must(timeFilter);
filter = QueryBuilders.boolQuery().mustNot(wChatFilters);
這種是沒(méi)辦法做到的芦缰,這樣只會(huì)過(guò)濾掉所有type=2的文檔以及所有兩天以外的文檔。
繼續(xù)探索枫慷。让蕾。。