[12]minimumShouldMatch的使用

2020-08-06  本文已影响0人  不怕天黑_0819

本文集主要是总结自己在项目中使用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来实现。

http://blog.csdn.net/xiao_jun_0820/article/details/51095521

上一篇 下一篇

猜你喜欢

热点阅读