本文集主要是总结自己在项目中使用ES 的经验教训,包括各种实战和调优。
首先代码记录如下:注意termsQuery传入list的最大值为1024.所以通过booleanQuery进行组合。
另外关于booleanQuery的使用注意:must语句都需要匹配,而所有的must_not语句都不能匹配,但是should语句需要匹配多少个呢?默认情况下,should语句一个都不要求匹配,只有一个特例:如果查询中没有must语句,那么至少要匹配一个should语句。
但是我们需求是must语句作为时间筛选,should语句也必须要匹配上一个,但是默认含有must语句以后就不要求匹配should语句,所以我们通过minimumShouldMatch来设置最少匹配一个,避免should语句一个都不匹配的错误情况。另外关于minimumShouldMatch的详细使用可以参考文档底部。
public static Map<String,Object> searchBymethod3(List<String> wemediaIds, int pageNo, int size, String ... str){
Long start = System.currentTimeMillis();
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("subscribe_moparticle").setTypes("moparticle");
QueryBuilder filter = QueryBuilders.rangeQuery("ptime").gt("0000-05-16 00:00:00");
QueryBuilder matchQuery1 = QueryBuilders.termsQuery("topicid",list1 );
QueryBuilder matchQuery2 = QueryBuilders.termsQuery("topicid",list2 );
QueryBuilder matchQuery3 = QueryBuilders.termsQuery("topicid",list3 );
QueryBuilder matchQuery4 = QueryBuilders.matchAllQuery();
QueryBuilder matchQuery5 = QueryBuilders.boolQuery().must(filter).should(matchQuery1).should(matchQuery2).should(matchQuery3).minimumShouldMatch(1);
searchRequestBuilder.setQuery(matchQuery5).setFrom(0).setSize(10).addSort("ptime",SortOrder.DESC);
SearchResponse response = searchRequestBuilder.execute().actionGet();
// 输出结果
SearchHits searchHits = response.getHits();
log.info("共搜到:" + searchHits.getTotalHits() + "条结果!");
for (SearchHit hit : searchHits) {
log.info(hit.getSource().get("ptime")+"---" + hit.getSourceAsString());
}
log.info(System.currentTimeMillis()-start+"ms used");
return null;
}
minimumShouldMatch使用说明:直接看链接就可以。注意使用termQuery时如果是text类型,其实会分词成许多term从句,这样可能会影响匹配结果,所以官网不建议使用termQuery来进行text类型的匹配。应该使用matchQuery来实现。
网友评论