@
目录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"));