Elasticsearch专栏-4.es基本用法-查询api

es基本用法-查询api

说明

es对数据的检索,总结下来就是两部分,即查询和处理。查询指的是查找符合条件的数据,包括查询所有、匹配查询、布尔查询、范围查询、模糊查询等等。处理指的是对查询到的数据做进一步处理,包括是否分页、是否排序、是否聚合、是否分组、是否只返回部分字段等等。es的api就是对这两部分的不同组合。举例如下,数据集使用上一篇创建的bank索引。

查询所有

c 复制代码
GET /bank/_search
{
  "query":{
    "match_all": {}
  }
}

某一字段匹配查询

这块的查询已经涉及到了分词,指的是查询address中包含Place或National的文档。针对分词查询后面会进一步做深入讲解。

c 复制代码
GET /bank/_search
{
	"query": {
		"match": {
			"address": "Place National"
		}
	}
}

多字段查询

multi_match用在多字段查询中,下面的语句表示,只要address或city中,包含mill和urie其中的一个,就算是命中查询。用sql语句表示: select * from bank where (address like '%mill%' or like '%urie%') or (citylike '%mill%' or like '%urie%')

c 复制代码
GET /bank/_search
{
  "query":{
    "multi_match": {
      "query": "mill urie",
      "fields": ["address","city"]
    }
  }
}

bool查询

bool查询主要用到三个关键字:must、must_not、should。在mysql中,就是and、not、or的概念。

其中,must表示必须包含,must_not表示一定不能包含,should表示可以包含,也可以不包含。包含的话,排名要比不包含的靠前。

c 复制代码
GET /bank/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"gender": "M"
					}
				},
				{
					"match": {
						"address": "mill"
					}
				}
			],
			"must_not": [
				{
					"match": {
						"age": "18"
					}
				}
			],
			"should": [
				{
					"match": {
						"lastname": "Wallace"
					}
				}
			]
		}
	}
}

范围查询

在范围查询中,使用的关键词有range、filter,以及表示大于小于的gt、lt、gte、lte。

关键字 含义
gt 大于
lt 小于
gte 大于等于
lte 小于等于
  1. rang方式
c 复制代码
GET /bank/_search
{
	"query": {
	  "range": {
		"age": {
		  "gte": "20",
		  "lte": "25"
		  }
	  }
	}
}
  1. filter方式
c 复制代码
GET /bank/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"gender": "M"
					}
				},
				{
					"match": {
						"address": "mill"
					}
				}
			],
			"filter": [
				{
					"range": {
						"age": {
							"gte": 10,
							"lte": 50
						}
					}
				},
				{
					"range": {
						"balance": {
							"gte": 9812,
							"lte": 9813
						}
					}
				}
			]
		}
	}
}

精确查询

精确查询可以简单理解为完全匹配查询,用term关键字。在数值型查询中经常用到,而在文本中查询使用,是表示查询时不进行分词,刚好和分词查询关键字match对立。

1.查询单个

c 复制代码
GET /bank/_search
{
	"query": {
		"match": {
			"age": 33
		}
	}
}

2.查询多个,此时用terms

c 复制代码
GET /bank/_search
{
	"query": {
		"terms": {
		  "balance": [
		    "34487",
		    "29104"
		  ]
		}
	}
}

2.查询多个,也可以用另外一种方式:should+term

c 复制代码
GET /bank/_search
{
	"query": {
	  "bool": {
	    "should": [
	      {
	        "term": {
	          "balance": "34487"
	        }
	      },
	      {
	        "term": {
	          "balance": "29104"
	        }
	      }
	    ]
	  }
	}
}

正则匹配

c 复制代码
GET /bank/_search
{
  "query": {
    "wildcard": {
        "firstname": "*amber"
    }
  }
}

模糊查询

c 复制代码
GET /bank/_search
{
  "query": {
    "fuzzy": {
        "firstname": "hol"
    }
  }
}

上述只罗列了常用的查询,除此之外,还有很多其他查询,这里不做演示,感兴趣的小伙伴可以自己查找下。

结果处理

开头我们也说了,es对数据的处理就两部分,查询和处理。上面介绍了查询,现在我们介绍下基本的处理:分页、排序、返回部分字段。

关键字 含义
sort desc/asc
from 页数,从0开始
size 每页大小
_source 只返回需要的字段,可以罗列字段,也可以用通配符
c 复制代码
GET /bank/_search
{
	"query": {
		"match": {
			"address": "Hendrickson"
		}
	},
	"sort": [
		{
			"balance": "desc"
		}
	],
	"from": 0,
	"size": 5,
	"_source": [
		"balance",
		"account_number",
		"address"
	]
}
c 复制代码
GET /bank/_search
{
	"query": {
		"match": {
			"address": "Hendrickson"
		}
	},
	"sort": [
		{
			"balance": "asc"
		}
	],
	"from": 0,
	"size": 5,
	"_source":{
     "includes": "addr*",
     "excludes": ["name","bir*"]
  }
}
相关推荐
Elastic 中国社区官方博客1 天前
通过自主 IT 平台和 Elastic 迈出可观测性的下一步
大数据·elasticsearch·搜索引擎·全文检索·可用性测试
Keep Running *1 天前
ElasticSearch_学习笔记
elasticsearch·搜索引擎
切糕师学AI1 天前
Elasticsearch RRF(倒数排序融合)技术详解与实践
算法·elasticsearch·搜索引擎·混合搜索·rrf·归一化问题
Elasticsearch1 天前
如何比较两个 Elasticsearch 索引并找出缺失的文档
elasticsearch
海兰1 天前
使用 Elastic Workflows 监控 Kibana 仪表板访问数据
android·人工智能·elasticsearch·rxjava
希望永不加班2 天前
SpringBoot 整合 Elasticsearch 实现全文检索
java·spring boot·后端·elasticsearch·全文检索
risc1234562 天前
【Elasticsearch】副本分片(Replica Shard)的 globalCheckpoint 更新与推进机制
elasticsearch
Makoto_Kimur2 天前
Elasticsearch面试八股整理
elasticsearch
青稞社区.2 天前
Claude Code 源码深度解析:运行机制与 Memory 模块详解
大数据·人工智能·elasticsearch·搜索引擎·agi
Aktx20FNz2 天前
iFlow CLI 完整工作流指南
大数据·elasticsearch·搜索引擎