一、使用match进行匹配的时候:
1.匹配的时候,如果想尽可能的多检索结果,考虑使用match;
2.如果想尽可能精确的匹配分词结果,考虑使用match_phrase;
3.如果短语匹配的时候,怕遗漏,考虑使用match_phrase_prefix。
二、使用term匹配的时候,主要是确定词匹配 keyword或者 integer类型,可以是数组
三、使用must和should结合的时候,层级关系不同导致的结果不同,AND 结合 OR形式应该如这种
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));
}
四、可以使用range来确定范围,时间上比较常用:
boolQueryBuilder.must(QueryBuilders.rangeQuery("infotime").gte(opinionSearchBean.getStartTime().getTime())
.lte(opinionSearchBean.getEndTime().getTime()));
五、对id进行过滤
boolQueryBuilder.filter(QueryBuilders.idsQuery().types("opiniondata")
.addIds(opinionids.toArray(new String[opinionids.size()])));