1.匹配的时候,若是想尽量的多检索结果,考虑使用match;
2.若是想尽量精确的匹配分词结果,考虑使用match_phrase;
3.若是短语匹配的时候,怕遗漏,考虑使用match_phrase_prefix。数组
private static void addKeywordSearchQuery(String keyWordStr,BoolQueryBuilder boolQueryBuilder){ String[] keywords = keyWordStr.split("\\|"); //这里注意must必须为平级,不然会合并 BoolQueryBuilder shouldBool = QueryBuilders.boolQuery(); for (int i = 0; i < keywords.length; i++) { if (StringUtils.isNotEmpty(keywords[i])) { String[] split = keywords[i].split("\\+| "); if (split.length>1){ BoolQueryBuilder contetnQuery = QueryBuilders.boolQuery(); BoolQueryBuilder titleQuery = QueryBuilders.boolQuery(); for (int j = 0; j < split.length; j++) { if (!StringUtils.isEmpty(split[j])){ contetnQuery.must(QueryBuilders.matchPhrasePrefixQuery("content",split[j])); titleQuery.must(QueryBuilders.matchPhrasePrefixQuery("title",split[j])); } } shouldBool.should(QueryBuilders.boolQuery().should(contetnQuery).should(titleQuery)); }else { BoolQueryBuilder contentShould = QueryBuilders.boolQuery(); contentShould.should(QueryBuilders.matchPhrasePrefixQuery("content", keywords[i])); contentShould.should(QueryBuilders.matchPhrasePrefixQuery("title", keywords[i])); shouldBool.should(contentShould); } } } boolQueryBuilder.must( QueryBuilders.boolQuery().must(shouldBool)); }
boolQueryBuilder.must(QueryBuilders.rangeQuery("infotime").gte(opinionSearchBean.getStartTime().getTime()) .lte(opinionSearchBean.getEndTime().getTime()));
boolQueryBuilder.filter(QueryBuilders.idsQuery().types("opiniondata") .addIds(opinionids.toArray(new String[opinionids.size()])));