查询简介
叶子查询子句
叶子查询子句在特定字段中查找特定值,例如match,term或range查询。 这些查询可以自己使用。
复合查询子句
复合查询子句包装其他叶查询或复合查询,并用于以逻辑方式组合多个查询(例如bool或dis_max查询),或更改其行为(例如constant_score查询)。复合查询子句包含以下几种:
- bool query
- boosting query
- constant_score query
- dis_max query
- function_score query
我们通常只会用到bool查询
查询子句的行为会有所不同,具体取决于它们是在查询上下文中(Query)还是在过滤器(Filter)上下文中使用。
1、term和terms
terms相关于sql里的In
term后面的value,不能是数组,只能是一个值,否则会报错。比如 {"term":{"age":"80后"}}
terms后面的value,必须是数组,不能是一个值,否则会报错,比如 {"term":{"age":["80后"]}}
term和terms等查询,不会对查询对字段进行分词处理,适合于date、num、id等确切数据进行搜索
例如:age字段包含的值为80后、90后。使用term查询,{"term":{"age":"80后"}} 这样是无法查询到age是"80后"的数据的,因为term不会对"80后"进行分词,而es中存储的age字段,会把"80后"分成“80”和“后”,没有“80后”,所以使用term无法查询到
es会对中文,-等组成的字符串自动分词
解决此问题需要使用keyword
{"term":{"age.keyword":"80后"}}
# 查询age为39的所有记录
POST /bank/_search?pretty
{ "query": {"term": { "age": 39 } }}
# terms后的values值,如果是数组的话,是或的关系,不是且的关系。
# 以下示例为查询property_newOrOldExtent,可能是10,或者8,或者5...的数据
{"terms":{"property_newOrOldExtent":[10,8,5,3,0]}}
must
相当于sql里的and
出现于匹配查询当中,有助于匹配度(_score)的计算
must_not
相当于sql里的not
满足的内容不会出现,与filter功能相反,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据
shoud
相当于sql里的or
该条件下的内容是应该满足的内容,如果符合会增加分值,不符合降低分值,不会不显示
shoud_not
filter
必须满足才能出现,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据
2、match
match的所有方法,都会对字段进行分词,所查询的字段数据只要包含分词后结果的一个,就会被查询到
match_phrase:短语匹配查询,必须匹配短语中的所有分词,并且保证各个分词的相对位置不变
multi_match:查询多个字段包含某个关键词的数据
# 查询content或education中含有"大学"的数据
GET index_1/_search
{
"query": {
"bool": {
"filter": {
"multi_match": {
"query": "大学",
"fields": ["content", "education"]
}
}
}
}
match_all:查询所有文档
GET index_1/_search { "query": { "match_all": {} }
3、range
range范围查找,查找某一范围的所有数据
gt:大于
gte:大于等于
lt:小于
lte:小于等于
# 查询时间大于等于2019-08-10 10:08:29,小于等于2019-08-13 10:08:29的数据
GET index_4/_search
{
"query": {
"bool": {
"filter": {
"range": {
"date": {
"gte": "2019-08-10 10:08:29",
"lte": "2019-08-13 10:08:29"
}
}
}
}
}
4、sort
sort按照某些字段对数据进行排序,可以是一个字段,也可以是多个字段
desc:降序
asc:生序
# 查询数据按照时间的降序排列
GET index_1/_search
{
"sort": [
{
"date": {
"order": "desc"
}
}
],
"query": {
"match_all": {}
}
5、_source
对于搜索的结果,只关注某些字段的值
# 查询所有的数据的name和age
GET index_1/_search
{
"_source": ["name", "age"],
"query": {
"match_all": {}
}
6、from和size
from:从某个位置开始查询,最小为0,某些情况下可以为-1(下一篇说明)
size:查询长度
from+size不能大于10000,否则es会报错(下一篇解决)
# 查询前20条数据,并按照date的降序排列
GET index_1/_search
{
"from": 0,
"size": 20,
"sort": [
{
"date": {
"order": "desc"
}
}
],
"query": {
"match_all": {}
}
}
7、fuzzy
模糊匹配
8、wildcard
通配符查询
must的两个条件都必须满足,should中的两个条件至少满足一个就可以。
综合示例
GET idx_pro/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "花花公子羽绒服"
}
}
],
"must_not": [
{
"term": {
"proId": 6
}
}
],
"should": [
{
"terms": {
"name.keyword": ["花花公子暖心羽绒服", "花花公子外套"]
}
}
],
"filter": {
"range": {
"createTime": {
"gte": "2019-12-12 17:56:56",
"lte": "2019-12-19 17:56:56",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
}