ES-- match查询

@

2.2、match查询

match查询属于高层查询,会根据你查询的字段的类型不一致,采用不同的查询方式。

  • 如果查询的是日期或者数值的字段,他会自动将你的字符串查询内容转换成日期或者数值对待;
  • 如果查询的内容是一个不能被分词的字段(keyword).match查询不会对你的指定查询关键字进行分词;
  • 如果查询的内容是一个可以分词的字段(text),match会将你指定的查询内容根据一定的方式去分词,然后去分词库中匹配指定的内容。

总而言之:match查询,实际底层就是多个term查询,将多个term查询的结果汇集到一起返回给你。

2.2.1、match_all

参考官网 Elasticsearch Reference [7.10] » Query DSL » Match all query

2.2.1.1、命令行

查询全部内容,所有的_socre都是1.0

GET /sms-logs-index/_search
{
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

2.2.1.2、java代码

    @Test
    public void matchAllQuery() throws IOException {
        //1、创建SearchRequest对象
        SearchRequest searchRequest = new SearchRequest();

        //2、指定查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(20); // ES 默认只查询10条,如果想查询更多,添加size()
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        // 3、将条件封装到Request对象中
        searchRequest.source(searchSourceBuilder);

        // 4、执行查询
        SearchResponse resp = client.search(searchRequest, RequestOptions.DEFAULT);

        // 5、打印结果
        for (SearchHit hit : resp.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }

        // 打印条数
        System.out.println(resp.getHits().getHits().length);

    }

在这里插入图片描述

2.2.2、match

2.2.2.1、命令行

POST /sms-logs-index/_search
{
  "query": {
      "match": {
        "smsContent": "魅力宣传"
      }
  }
}

2.2.2.2、java 代码

smsContent 是一个 text,可以进行分词
在这里插入图片描述

2.2.3、布尔match

拥有match查询的特性,同时可以基于一个field匹配内容,采用and或者or的方式

2.2.3.1、命令行

POST /sms-logs-index/_search
{
  "query": {
      "match": {
        "smsContent": {
          "query": "魅力 宣传",
          "operator": "or"
        }
      }
  }
}

POST /sms-logs-index/_search
{
  "query": {
      "match": {
        "smsContent": {
          "query": "魅力 宣传",
          "operator": "and"
        }
      }
  }
}

2.2.3.2、java 代码

    @Test
    public void matchBoolQuery() throws IOException {
        //1、创建SearchRequest对象
        SearchRequest searchRequest = new SearchRequest();

        //2、指定查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(20); // ES 默认只查询10条,如果想查询更多,添加size()

        // searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.query(QueryBuilders.matchQuery("smsContent", "魅力 宣传").operator(Operator.AND));

        // 3、将条件封装到Request对象中
        searchRequest.source(searchSourceBuilder);

        // 4、执行查询
        SearchResponse resp = client.search(searchRequest, RequestOptions.DEFAULT);

        // 5、打印结果
        for (SearchHit hit : resp.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }

        // 打印条数
        System.out.println(resp.getHits().getHits().length);

    }

2.2.4、multiMatch

拥有match的特性,multi_match针对多个field进行检索,多个field对应一个查询的关键字;

2.2.4.1、命令行

实现要求,查询包含北京的字段province或者字段smsContent。

POST /sms-logs-index/_search
{
  "query": {
      "multi_match": {
        "query": "北京",
        "fields": ["province", "smsContent"]
      }
  }
}
 

2.2.4.2、java 代码

        // searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("北京", "province", "smsContent"));

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

在这里插入图片描述

原文地址:https://www.cnblogs.com/chengbao/p/14975202.html