Elasticsearch search使用幾點總結

1、使用match進行匹配的時候:

1.匹配的時候,若是想盡量的多檢索結果,考慮使用match;
2.若是想盡量精確的匹配分詞結果,考慮使用match_phrase;
3.若是短語匹配的時候,怕遺漏,考慮使用match_phrase_prefix。數組

2、使用term匹配的時候,主要是肯定詞匹配 keyword或者 integer類型,能夠是數組

3、使用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));

    }

4、能夠使用range來肯定範圍,時間上比較經常使用:

boolQueryBuilder.must(QueryBuilders.rangeQuery("infotime").gte(opinionSearchBean.getStartTime().getTime())
                    .lte(opinionSearchBean.getEndTime().getTime()));

5、對id進行過濾

boolQueryBuilder.filter(QueryBuilders.idsQuery().types("opiniondata")
                    .addIds(opinionids.toArray(new String[opinionids.size()])));

6、對某個值進行排序的時候,若是沒有設置默認值,則這個值初始化是null,這時候排序則部分生效,若是須要對某個值進行排序的時候,須要進行初始值設置便可。

相關文章
相關標籤/搜索