ElasticSearch复杂检索

新建一个索引

PUT /approval_list_zhc

插入数据

{
  "name":"xilianpeng",
  "age":27,
  "email":"xilianpeng@hrfax.cn",
  "sex":"0",
  "salary":35000
}

查询全部

{"query":{"match_all":{}}}

查询全部,并按salsry倒序排序

{
	"query": {
		"match_all": {

		}
	},
    "sort":{
        "salary":"desc"
    }
}

查询全部,并按salary倒序,如果salary相同,按age升序排序

{
	"query": {
		"match_all": {

		}
	},
	"sort": [{
		"salary": "desc"
	}, {
		"age": "asc"
	}]
}

查询第一第二条数据,按salary降序,age升序

{
	"query": {
		"match_all": {

		}
	},
	"sort": [{
		"salary": "desc"
	}, {
		"age": "asc"
	}],
	"from": 0,
	"size": 2
}

_source指定返回哪几个字段

{
	"query": {
		"match_all": {

		}
	},
	"sort": [{
		"salary": "asc"
	}, {
		"age": "asc"
	}],
	"from": 1,
	"size": 2,
	"_source": ["name", "age"]
}

match 指定哪个属性匹配哪个值,如检索age是20的信息

{
	"query": {
		"match": {
			"age": 20
		}
	}
}

match 匹配字符串字段就是模糊搜索(维护了一个倒排索引)

比如说“wangcai erha”,能匹配出email值为"wangcai erha gouzi"和"wangcai erha "
match 匹配非字符串的就是精确搜索

{
   "query": {
   	"match": {
   		"email": "wangcai erha"
   	}
   }
}

match_phrase 短语匹配

如果匹配"wangcai erha gouzi",那么email字段下必须是有"wangcai erha gouzi"这完整的短语,如果是match的话,只要包含一个就能匹配出来,比如包含了"wangcai erha"的email字段也能匹配出来

{
	"query": {
		"match_phrase": {
			"email": "wangcai erha gouzi"
		}
	}
}

用match_phrase只能检索出一个
image.png

用match能检索出2个结果
image.png

multi_match 多字段匹配

查询只要email字段里包含erha或gouzi的数据

{
	"query": {
		"multi_match": {
			"query": "erha gouzi",
			"fields": "email"
		}
	}
}

bool查询

可以合并多个查询条件。以下条件是 必须sex字段为1,并且必须email字段包含erha, must为必须

{
     "query": {
		"bool": {
			"must": [{
					"match": {
						"sex": 1
					}
				},
				{
					"match": {
						"email": "erha"
					}
				}
			]
		}
	}
}

must_not 必须不满足,以下是多条件复合查询。

{
	"query": {
		"bool": {
			"must": [{
					"match": {
						"sex": 1
					}
				},
				{
					"match": {
						"email": "erha"
					}
				}
			],
			"must_not": [{
				"match": {
					"name": "wangcai"
				}
			}]
		}
	}
}

should 满足should的条件最好,得分最高,不满足也没关系

{
	"query": {
		"bool": {
			"must": [{
					"match": {
						"sex": 1
					}
				},
				{
					"match": {
						"email": "erha"
					}
				}
			],
			"should": [{
				"match": {
					"name": "wangcai"
				}
			}]
		}
	}
}

filter 过滤,会把不满足这个条件的过滤掉

{
	"query": {
		"bool": {
			"must": [{
				"match": {
					"sex": 1
				}
			}],
			"filter": {
				"range": {
					"salary": {
						"gte": 20000,
						"lte": 30000
					}
				}
			}
		}
	}
}

term 找精确字典的,非文本字典用term查询。

由于ES在保存text字段的时候,存在分词的问题。用term检索整个完整的值是非常困难的

{
	"query": {
		"term": {
			"salary": 20000
		}
	}
}

字段.keyword 相当于精确匹配

{
	"query": {
		"match": {
			"email.keyword": "wangcai erha"
		}
	}
}

aggregations 聚合

要做一个聚合
  为这个聚合起一个名字
    做什么类型的聚合
      聚合体的内容
        聚合里的元数据
    基于上一次的聚合再进行聚合,子聚合

image.png

{
	"query": {
		"match_all": {}
	},
	"aggs": {
		"ageAgg": {
			"terms": {
				"field": "age",
				"size": 10
			}
		}
	}
}

按照年龄所有可能的值来聚合
image.png

可以多个聚合,年龄所有可能的值来聚合,平均工资聚合

{
	"query": {
		"match_all": {}
	},
	"aggs": {
		"ageAgg": {
			"terms": {
				"field": "age",
				"size": 10
			}
		},
		"salayAvg": {
			"avg": {
				"field": "salary"
			}
		}
	}
}

image.png

聚合里面再套聚合,这个年龄段下面的人的平均工资

{
	"query": {
		"match_all": {}
	},
	"aggs": {
		"ageAgg": {
			"terms": {
				"field": "age",
				"size": 10
			},
			"aggs": {
				"ageAvg": {
					"avg": {
						"field": "salary"
					}
				}
			}
		}
	}
}

结果:

image.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值