ES-- match查询
@[TOC]
## 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](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/query-dsl-match-all-query.html#query-dsl-match-all-query)
#### 2.2.1.1、命令行
查询全部内容,所有的`_socre`都是`1.0`
```
GET /sms-logs-index/_search
{
"query": {
"match_all": {}
}
}
```
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331101023258.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70)
#### 2.2.1.2、java代码
```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);
}
```
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331102100371.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70)
### 2.2.2、match
#### 2.2.2.1、命令行
```
POST /sms-logs-index/_search
{
"query": {
"match": {
"smsContent": "魅力宣传"
}
}
}
```
#### 2.2.2.2、java 代码
smsContent 是一个 text,可以进行分词
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331102905325.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70)
### 2.2.3、布尔match
**拥有match查询的特性,同时可以基于一个field匹配内容,采用and或者or的方式**
#### 2.2.3.1、命令行
```json
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 代码
```java
// searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("北京", "province", "smsContent"));
```
# 关注我的公众号【宝哥大数据】,更多干货
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210706081624305.png)