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()])));