ES的复杂查询(三)

本文介绍了Elasticsearch的查询操作,包括查询全部文档、匹配查询、多字段匹配、精确查询、多字段精确查找、指定查询字段、过滤字段、组合查询、范围查询、模糊查询、排序和高亮显示。示例中详细解释了各种查询方式的用法和效果,如使用match_all、match、fuzzy等查询类型,并展示了如何进行高亮和分页处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我于黑夜中相信自己,相信自己一定能一往无前,即使我没有钱.

上一章简单介绍了ES的索引文档映射操作(二),如果没有看过,请观看上一章

这一篇,老蝴蝶带着大家学习一下 查询的相应操作.

一. 前期准备

  1. 将之前的索引删掉

image-20230406154655839

  1. 创建一个新的 student 索引

image-20230406154629159

  1. 创建一个映射关系

多添加了

image-20230406154727496

  1. 添加数据
POST   http://localhost:9200/student/_doc/1

{
    "name": "岳泽霖",
     "nickname": "小泽霖",
    "sex": "男",
    "age":28
}
POST   http://localhost:9200/student/_doc/2

{
    "name": "岳建立",
     "nickname": "小建立",
    "sex": "男",
    "age":26
}
POST   http://localhost:9200/student/_doc/3

{
    "name": "张三",
     "nickname": "张三",
    "sex": "男",
    "age":24
}
POST   http://localhost:9200/student/_doc/4

{
    "name": "李四",
     "nickname": "李四",
    "sex": "女",
    "age":24
}
POST   http://localhost:9200/student/_doc/5

{
    "name": "王二",
     "nickname": "王二",
    "sex": "女",
    "age":16
}

二. 查询

二.一 查询全部文档

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

类似于 数据库中的 where 1=1

image-20230406200331838

字段含义
took查询花费时间,单位毫秒
timed_out是否超时 false 为不超时
_shards分片信息
_shards.total总的分片数
_shards.successful成功的分片信息
_shards.skipped忽略的分片信息
_shards.failed失败的分片信息
hits搜索命中结果
hits.total.value搜索条件匹配的文档总数
hits.total.relation计数规则 eq 表示计数准确, gte 表示计数不准确
max_score匹配度分值
hits命中结果集合

二.一 匹配查询

{
    "query":{
        "match":{
            "name":"岳泽霖"
        }
    }
}

会将 岳泽霖 进行拆分, 拆分成 姓 “岳” “泽” “霖”

类似于 name like ‘%岳%’ or name like ‘%泽%’ or name like ‘%霖%’

image-20230406200435094

如果只传入泽霖, 泽霖可以拆分, 会 name like ‘%泽%’ or name like ‘%霖%’

image-20230406200557161

可以验证一下, 只传入一个 霖

image-20230406200650988

二.三 一个值匹配多个字段

{
    "query":{
        "multi_match":{
            "query":"小",
            "fields":["name","nickname"]
        }
    }
}

类似于: name 可以 query ‘小’, nickname 也可以 query ‘小’

image-20230406200832368

二.四 关键字精确查询

term 查询, 精确的关键词匹配查询, 不会对查询的条件进行分词. 传入什么,就是什么.

如果传入 泽霖的话 , 数据存储时, 已经将 岳泽霖 拆分成3段了, 岳, 泽,霖, 所以传入 泽霖 是查询不出来的。

{
    "query":{
        "term":{
            "name":{
                "value":"泽霖"
            }
        }
    }
}

类似于 name =“泽霖”

image-20230406201254513

如果只传入 霖的话, 是可以查询出来的。

image-20230406201328493

三.五 多字段精确查找

与 term 查询一样,也不可以将查询条件拆分, 但它允许指定多值进行匹配

{
    "query":{
        "terms":{
            "name":["泽","岳"]
        }
    }
}

类似 于 name in (‘泽’,‘岳’)

image-20230406201507269

二.六 指定查询字段

默认会将 _score 中的所有的字段都返回, 如果我们只想获取其中的部分字段, 可以使用 _source 过滤

{
    "_source":["name","nickname"],
    "query":{
        "terms":{
            "name":["岳","泽"]
        }
    }
}

类似于 select name ,nickname 之前是 select *

image-20230406201632787

二.七 过滤字段

可以使用 includes 和 excludes 来 进行控制

includes 表示 想要显示的字段, excludes 表示不想要显示的字段

二.七.一 includes 显示字段

{
    "_source":{
        "includes":["name","nickname"]
    },
    "query":{
        "terms":{
            "name":["岳","泽"]
        }
    }
}

image-20230406201806385

二.七.二 excludes 不显示字段

{
    "_source":{
        "excludes":["name","nickname"]
    },
    "query":{
        "terms":{
            "name":["岳","霖"]
        }
    }
}

不显示 name 和 nickname

image-20230406201908879

二.八 组合查询

使用 bool, 把各种其它查询通过 must (必须) must_not ( 必须不) should ( 应该) 的方式进行组合。

类似于多个条件的 and 合并 。 must 可以理解为 = must_not 为 != should 该条件不处理

如查询 性别必须是男, 年龄不为 26, 姓名可以为 岳的

{
    "_source":["name","nickname"],
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "sex":"男"
                    }
                }
            ],
            "must_not":[
                {
                    "match":{
                        "age":"26"
                    }
                }
            ],
            "should":[
                {
                    "match":{
                        "name":"岳"
                    }
                }
            ]
        }
    }
}

类似于 : sex =‘男’ and age !=26

image-20230406202332894

二.九 范围查询

range 查询找到那些落在指定区间内的数字或者时间。 支持 数字和日期

range 允许的字符

操作符说明
gt>
gte>=
lt<
lte<=

查询一下, 年龄在 25 到 30 之间

{
     "_source":["name","nickname"],
    "query":{
        "range":{
            "age":{
                "gte":25,
                "lte":30
            }
        }
    }
}

类似于: age between 25 and 30

image-20230406202644991

二.十 模糊查询

返回包含与搜索字词相似的字词的文档。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数. 这些更改可以包括:

  • 更改字符(box → fox)

  • 删除字符(black → lack)

  • 插入字符(sic → sick)

  • 转置两个相邻字符(act → cat)

为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体 或扩展。然后查询返回每个扩展的完全匹配。

通过 fuzziness 修改编辑距离。一般使用默认值AUTO,根据术语的长度生成编辑距离

{
    "query":{
        "fuzzy":{
            "name":{
                "value":"霖"
            }
        }
    }
}

image-20230406202836353

添加 fuzziness 为2

{
    "query":{
        "fuzzy":{
            "name":{
                "value":"霖",
                "fuzziness": 2
            }
        }
    }
}

会将数据 都可以出来

二.十一 排序

sort 可以让我们按照不同的字段进行排序, 并且通过 order 指定排序的方式。 asc 为升序, desc 为 降序

二.十一.一 单字段排序

{
    "_source":["name","nickname"],
    "query":{
        "fuzzy":{
            "name":{
                "value":"岳"
            }
        }
    },
    "sort":[
        {
            "age":{
                "order":"desc"
            }
        }
    ]
}

类似于 order by age desc

image-20230406203231750

二.十一.二 多字段排序

可以将 _score 和 age 进行排序, _score 为结果的匹配度, 先按照匹配度降序排,再按照年龄升序排.

{
    "query":{
        "fuzzy":{
            "name":{
                "value":"霖",
                "fuzziness": 2
            }
        }
    },
    "sort":[
        {
            "_score":{
                "order":"desc"
            }
        },
        {
            "age":{
                "order":"asc"
            }
        }
    ]
}

类似于 _score desc , age asc

image-20230406203713495

二.十二 高亮查询

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。

image-20230406203817888

Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。

在使用match 查询的同时,加上一个 highlight 属性:

  • pre_tags:前置标签

  • post_tags:后置标签

  • fields:需要高亮的字段

  • title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空

{
   "query":{
        "match":{
            "name":"岳"
        }
    },
    "sort":[
        {
            "_score":{
                "order":"desc"
            }
        },
        {
            "age":{
                "order":"asc"
            }
        }
    ],
    "highlight":{
        "pre_tags":"<font color='red'>",
        "post_tags":"</font>",
        "fields":{
            "name":{}
        }
    }
}

高亮一下 岳 进行查询

image-20230406204311506

二.十三 分页查询

使用 from ,size 进行处理

from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size

size:每页显示多少条

{
     "query":{
        "match_all":{}
    },
    "from":1,
    "size":2
}

类似于 limit 1, 2

image-20230406204515240

关于聚合查询,老蝴蝶放置在下一章节进行演示



谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值