资讯专栏INFORMATION COLUMN

Elasticsearch search使用几点总结

DobbyKim / 366人阅读

摘要:一使用进行匹配的时候匹配的时候,如果想尽可能的多检索结果,考虑使用如果想尽可能精确的匹配分词结果,考虑使用如果短语匹配的时候,怕遗漏,考虑使用。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69387.html

相关文章

  • 有赞搜索系统的架构演进

    摘要:另外集群也没有做物理隔离,有一次促销活动就因为粉丝数据量过于庞大导致进程内存耗尽而,使得集群内全部索引都无法正常工作,这给我上了深深的一课。 有赞搜索平台是一个面向公司内部各项搜索应用以及部分 NoSQL 存储应用的 PaaS 产品,帮助应用合理高效的支持检索和多维过滤功能,有赞搜索平台目前支持了大大小小一百多个检索业务,服务于近百亿数据。 在为传统的搜索应用提供高级检索和大数据交互能...

    wh469012917 评论0 收藏0
  • Lucene解析 - 基本概念

    摘要:基本概念在深入解读之前,先了解下的几个基本概念,以及这几个概念背后隐藏的一些东西。如图是一个内的基本组成,内数据只是一个抽象表示,不代表其内部真实数据结构。即词典,是根据条件查找的基本索引。 前言 Apache Lucene是一个开源的高性能、可扩展的信息检索引擎,提供了强大的数据检索能力。Lucene已经发展了很多年,其功能越来越强大,架构也越来越精细。它目前不仅仅能支持全文索引,也...

    sunnyxd 评论0 收藏0
  • Lucene解析 - 基本概念

    摘要:基本概念在深入解读之前,先了解下的几个基本概念,以及这几个概念背后隐藏的一些东西。如图是一个内的基本组成,内数据只是一个抽象表示,不代表其内部真实数据结构。即词典,是根据条件查找的基本索引。 前言 Apache Lucene是一个开源的高性能、可扩展的信息检索引擎,提供了强大的数据检索能力。Lucene已经发展了很多年,其功能越来越强大,架构也越来越精细。它目前不仅仅能支持全文索引,也...

    appetizerio 评论0 收藏0

发表评论

0条评论

DobbyKim

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<