本章讲解ElasticSearch的结构化查询的相关知识
1.概念
前面我们提到了ES的DSL查询,我们只是简单列举了几个比较常用的查询,没有深入的去剖析,本章将基于此进行深度的讲解!
2.term/terms查询
1)term查询
term查询主要用于精确匹配哪些值,比如数字,日期,布尔值或者not_analyzed的字符串未经分析的文本数据类型。
范例:查询年龄为26的数据信息
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"term": {
"age": 26
}
}
}
查询结果为:
2)terms查询
terms查询和term比较类似,但terms允许指定多个匹配条件。如果某个字段指定了多个值,那么文档需要一起去匹配。
范例:查询年龄位26和30的用户数据信息
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"terms": {
"age": [26,30]
}
}
}
查询结果如下:
3.range查询
range查询可以允许我们按照指定的范围查找数据。
范围操作符:
gt:大于,gte:大于等于,lt:小于,lte:小于等于
范例:查询年龄大于等于26小于30的数据信息
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"range": {
"age": {
"gte": 26,
"lt": 30
}
}
}
}
查询结果如下:
4.exists查询
exists查询可以用于查找文档中是否包含指定字段或者没有某个字段,类似于SQL中的is null
范例:查询包含title字段的数据
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"exists": {
"field":"title"
}
}
}
查询结果如下:
显然是没有的,哈哈!
5.match查询
这个查询我们在之前是用到过的。
match查询时一个标准的查询,不论你需要全文本查询(模糊)还是精确查询都可以用它
范例:查询名字中带“云”字的数据信息
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"match": {
"name": "云"
}
}
}
查询结果如下所示:
6.bool查询
bool查询可以用来合并多个条件的查询结果的布尔逻辑,它包含下面的一些操作符:
范例:查询用户性别为男的且年龄不大于30岁的数据
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"bool": {
"must": {
"match": {
"sex": "男"
}
},
"must_not": {
"range": {
"age": {
"gt": 30
}
}
}
}
}
}
查询结果如下:
filter查询:
之前所说的must,must_not等查询都需要计算查询结果的匹配程度,也就是之前的元数据_source
我们的过滤查询则不用考虑那么多,且可以缓存查询结果,速度大大提升。
建议:精确匹配的时候考虑使用该过滤查询!
范例:查询年龄为26岁的数据
POST http://localhost:9200/jwang_test/user/_search
{
"query": {
"bool": {
"filter": {
"term": {
"age": 26
}
}
}
}
}
查询结果如下所示: