ealsticsearch多条件查询

时间:2021-02-11 05:36:31

前段时间在做多条件检索的时间遇到了一些问题,不晓得怎么构建多条件查询,跟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();    }}