zoukankan      html  css  js  c++  java
  • ElasticSearch(must、should、filter、must_not) bool的查询

    ElasticSearch的组合查询

    现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。

    你可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询(Bool)。

    代码示例:

    //new 一个查询对象  
    BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery();
    //也可以
    BoolQueryBuilder boolQueryBuilder = boolQuery();

    它主要的几个方法如下:

    1.must

    文档 必须 匹配这些条件才能被包含进来。相当于sql中的 and

    2.must_not

    文档 必须不 匹配这些条件才能被包含进来。相当于sql中的 not

    3.should

    如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。相当于sql中的or

    4.filter

    必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

    构造查询条件

    1. termQuery:精确查询(不分词)

    使用termQuery要注意的是,Elasticsearch5之后,取消了string类型,将原来的string类型拆分为text和keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。

    2. matchQuery:匹配查询(分词)

    match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,所以假如我搜索的条件输入的是"六年级",则会把各个年级(一年级至九年级)的数据都查询出来,因为其中都包含’年级’ 。

    3. queryString:精确查询

    4. wildcardQuery:模糊查询

    5. rangeQuery:范围查询

    代码示例:

      BoolQueryBuilder boolQueryBuilder = boolQuery();
             //精确查询
            if (searchDto.getId() != null) {
                boolQueryBuilder.must().add(termQuery("id", searchDto.getId()));
            }
            //模糊查询
            if (searchDto.getSkuLike() != null) {
                boolQueryBuilder.must().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getSkuLike())));
            }
           //范围查询
            if (searchDto.getSupplierAddTimeStart() != null) {
                boolQueryBuilder.must().add(rangeQuery("create_time").gte(searchDto.getSupplierAddTimeStart()));
            }
            //
            if (searchDto.getSupplierAddTimeEnd() != null) {
                boolQueryBuilder.must().add(rangeQuery("create_time").lte(searchDto.getSupplierAddTimeEnd()));
            }
            // or查询的情况 (Condition 1 OR Condition 2) AND Condition3 
            if (searchDto.getKeyword() != null) {
                BoolQueryBuilder childBoolQueryBuilder = boolQuery();
                childBoolQueryBuilder.should().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getKeyword())));
                childBoolQueryBuilder.should().add(wildcardQuery("title",StrUtil.format("*{}*",searchDto.getKeyword())));
                boolQueryBuilder.must().add(childBoolQueryBuilder);
            }
  • 相关阅读:
    解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
    QProcess进程间双向通信
    DB2使用存储过程插入数据
    Qt自定义圆周动画(360 10.0 的模仿作者写的)
    经典重温:给微软上课的快乐车夫
    很劲爆!紫光赵伟国在北京微电子会议上12条惊人语录
    中芯国际董事长周子学:技术终有山顶,我们用时间换技术
    windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
    VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
    Qt判断和打开进程(windows端),运行,检测,中止
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/14075446.html
Copyright © 2011-2022 走看看