ES--模糊查询(prefix,fuzzy,wildcard,range,regexp)

  主要是涉及ElasticSearch查询条件相对模糊,查询速度相对慢,实时查询时应尽量避免这些方式,但是这些查询方式又具有自己独特不可代替的功能,还是还有必要。

参考官网 Elasticsearch Reference [7.10] » Query DSL » Term-level queries

一、prefix查询

前缀查询,可以通过一个关键字 去指定一个field的前缀,从而查询到指定的文档

1.1、RESTful 代码

POST /sms-logs-index/_search
{
  "query": {
    "prefix": {
      "corpName": {
        "value": "上海"
      }
    }
  }
}

1.2、java 代码

    @Test
    public void prefixQuery() throws IOException {
        //1。创建request对象,查询用的对象一般都是SearchRequest对象
        SearchRequest mySearchRequest = new SearchRequest(index);

        //2,指定查询条件,依赖查询条件的对象SearchSourceBuilder的对象
        SearchSourceBuilder builder = new SearchSourceBuilder();

        // 查询套路, 只需要修改此处
        builder.from(0).size(10).query(QueryBuilders.prefixQuery("corpName", "上海"));

        mySearchRequest.source(builder);
        //3. 执行查询
        SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);

        //4. 获取到_source中的数据,并展示
        //注意RESTFUL风格上是两个hits,所以这里要两次getHits()
        for (SearchHit hit : search.getHits().getHits()) {
            Map<String, Object> result = hit.getSourceAsMap();
            System.out.println(result);
        }
    }

二、fuzzy查询

  模糊查询,我们输入字符的大概,ES就可以根据输入的内容去大概匹配一下结果,
同时也支持输入关键字的错别字,所以fuzzy查询本身相对不太精确和稳定,即错别字太多也可能导致查询无结果,需要则中使用。
不同于 MySQL 的 Like 查询,比 Like 查询要强大。

fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length

  • fuzziness:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段

    • 操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1
    • 如中文集团到中威集团编辑距离就是1,只需要修改一个字符;
    • 该参数默认值为0,即不开启模糊查询,一样的,
    • 如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也抓出来。
  • prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配不允许错别字匹配

    • 如这里等于1,则表示开头的中字必须匹配,不匹配则不返回
    • 默认值也是0
    • 加大prefix_length的值可以提高效率和准确率。

注意:这两个参数不是只适用于fuzzy查询,match查询一样适用。

2.1、RESTful 代码

POST /sms-logs-index/_search
{
  "query": {
    "fuzzy": {
      "corpName": {
        "value": "中文集团"
        ,"fuzziness":1
        ,"prefix_length": 1
      
      }
    }
  }
} 

#fuzzy查询2 允许编辑两次距离
POST /sms-logs-index/_search
{
  "query": {
    "fuzzy": {
      "corpName": {
        "value": "中文集团"
        ,"fuzziness":2
      
      }
    }
  }
}
 

2.1、java 代码

        // 查询套路, 只需要修改此处
        builder.from(0).size(10).query(QueryBuilders.fuzzyQuery("corpName", "中文集团").fuzziness(Fuzziness.TWO));

三、wildcard查询

通配查询,和MySQL中的 Like 是一个套路,可以在查询时,在字符串中指定通配符*和占位符?

3.1、RESTful 代码

# wildcard 查询 利用*做通配符
POST /sms-logs-index/_search
{
  "query": {
    "wildcard": {
      "corpName": {
        "value": "*集团"
      }
    }
  }
}

3.1、java 代码

        // 查询套路, 只需要修改此处
        builder.from(0).size(10).query(QueryBuilders.wildcardQuery("corpName", "*集团"));

四、range查询

范围查询,只针对数值类型(字符类型则不适用), 对某一个field进行大于或者小于的范围查询。

4.1、RESTful 代码

# range查询
POST /sms-logs-index/_search
{
  "query": {
    "range": {
      "fee": {
        "gte": 100,
        "lte": 500
      }
    }
  }
}


4.1、java 代码

        // 查询套路, 只需要修改此处
        builder.from(0).size(10).query(QueryBuilders.rangeQuery("fee").gte(100).lte(500));

五、regexp查询

正则表达式查询,通过编写的正则表达式进行内容匹配

5.1、RESTful 代码

# regexp查询
POST /sms-logs-index/_search
{
  "query": {
    "regexp": {
      "moblie": "13[0-9]{9}"
    }
  }
}


5.1、java 代码

        // 查询套路, 只需要修改此处
        builder.from(0).size(10).query(QueryBuilders.regexpQuery("moblie", "13[0-9]{9}"));

注意:prefix,fuzzy,wildcard,regexp查询相对都是精确的条件,查询效率也是相抵较低,业务要求实时性高的场景,应该避免使用

关注我的公众号【宝哥大数据】, 更多干货

在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值