Elasticsearch search使用幾點總結

NO IMAGE

一、使用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()])));

六、對某個值進行排序的時候,如果沒有設定預設值,則這個值初始化是null,這時候排序則部分生效,如果需要對某個值進行排序的時候,需要進行初始值設定即可。