2

一、使用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,这时候排序则部分生效,如果需要对某个值进行排序的时候,需要进行初始值设置即可。

七、创建一个index文档时如果数据量比较大则需要使用时间分片,查询时使用index-* 方式护着指定index-202001,index-202002方式进行指定文档搜索

八、如果需要搜索match文档关键字,分词之类的,需要在创建文档mapping时候就把搜索方式指定,分词方式指定,安装分词插件,这样数据导入进去的时候才能按照分词的方式进行存储,方便检索。


nohup
160 声望9 粉丝