Elasticsearch search使用几点总结

Elasticsearch查询技巧精要
本文介绍Elasticsearch中高效查询的方法,包括match、term、must与should结合使用等技巧,以及如何通过range确定时间范围,对ID进行过滤,并对特定字段进行排序。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值