您的位置:首页 > 其它

ealsticsearch多条件查询

2015-07-06 10:12 387 查看
前段时间在做多条件检索的时间遇到了一些问题,不晓得怎么构建多条件查询,跟solr有些不同,一开始是使用QueryBuider,可是发现不行,废话不多说了,直接贴代码:以下代码是动态构建查询语句:
private SearchRequestBuilder dynamicSearch(String index, String type, String startTime, String endTime, String status, String title, String city, String resOfficer, int pageIndex, int pageCapacity) {
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index)
.setTypes(type)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setPostFilter(FilterBuilders.rangeFilter("start_time").from(startTime).to(endTime))
.setFrom(pageIndex).setSize(pageCapacity)
.setExplain(true);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.mustNot(QueryBuilders.matchQuery("site", "www.huodongxing.com"));

//活动名称
if (!StringUtils.isEmpty(title)) {
queryBuilder.must(QueryBuilders.queryString(title).field("title"));
}

//城市
if (!StringUtils.isEmpty(city)) {
queryBuilder.must(termQuery("city", city));
}

//业务状态
if (!StringUtils.isEmpty(status)) {
if (status.equals(BusinessStatus.REJECTED.getCode()) || status.equals(BusinessStatus.COOPERATED.getCode())) {
queryBuilder.must(termQuery("bus_status", status));
}
}

//负责人
if (!StringUtils.isEmpty(resOfficer)) {
queryBuilder.must(queryString(resOfficer).field("resOfficer"));
}

if (StringUtils.isEmpty(title) && StringUtils.isEmpty(city) && StringUtils.isEmpty(status) && StringUtils.isEmpty(resOfficer)) {
searchRequestBuilder.setQuery(matchAllQuery());
}
searchRequestBuilder.setQuery(queryBuilder);
return searchRequestBuilder;
}

}
index 参数为elasticsearch的index,
type 为elasticsearch的type,这两个值是相当重要的。千万不能写错了哦。
然后直接调用
//start为页索引,length为页容量,其它参数为查询条件。
SearchRequestBuilder searchRequestBuilder = dynamicSearch(esIndex, esType, startTime, endTime, businessState, title, city, resOfficer, start, length);
SearchResponse response = searchRequestBuilder.execute().actionGet();
以下就是循环取数据了,网上都可以查到,少了一个构建Client的方法。补上:
import org.elasticsearch.ElasticsearchException;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.ImmutableSettings;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** Created by lixiaopeng on 2015/6/25.*/public class ESUtils {private static final Logger logger = LoggerFactory.getLogger(ESUtils.class);private static Client client;private static PropUtil prop = PropUtil.getInstance("/global.properties");static String IP = prop.getProperties().get("esIP").toString();static int port = Integer.valueOf(prop.getProperties().get("esPort").toString());public static Client getClient() {try {//            Settings settings = ImmutableSettings.settingsBuilder()//                    .put("cluster.name", "accu-elasticsearch").build();Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "behavior").build();client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(IP, port));} catch (ElasticsearchException e) {e.printStackTrace();logger.error("open elasticsearch client failure");}return client;}public static void closeClient(){client.close();}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: