Elasticsearch 基本使用(三)条件查询_es条件查询(1)

“total” : {
“value” : 1,
“relation” : “eq”
},
“max_score” : 14.199377,
“hits” : [
{
“_index” : “bank”,
“_type” : “_doc”,
“_id” : “0”,
“_score” : 14.199377,
“_source” : {
“account_number” : 0,
“balance” : 16623,
“firstname” : “Bradshaw”,
“lastname” : “Mckenzie”,
“age” : 29,
“gender” : “F”,
“address” : “244 Columbus Place”,
“employer” : “Euron”,
“email” : “bradshawmckenzie@euron.com”,
“city” : “Hobucken”,
“state” : “CO”
}
}
]
}
}

match_phrase_prefix

查询多个连续的词(term),最后一个词 以 prefix 查询
举例:name = my name is tony
查询条件值为 my n
match_phrase 查不到数据,因为 n 没有在字段分词找到对应的词
match_phrase_prefix 能查到数据,最后一个条件 值为 n,对n执行前缀查询,所以能查到

match_bool_prefix

条件分词后,前面的词以 term 查询,最后一个以 prefix 查询

should [
term: 条件分词1,
term: 条件分词2,
prefix:最后一个条件词
]

multi_match

友视需要在多个字段上查询相同条件。比如搜索商品关键词,既可以在商品名称上匹配,也可以在品牌名称上匹配

“multi_match”: {
“query”: “条件值”,
“fields”: [“goods_name”, “brand”]
}

复合查询

在实际使用中,往往是在多个条件下查询数据。

bool 查询

query 下使用 bool 聚合多条件,通过组合内部多个条件的逻辑关系,形成最终的查询条件。
bool 内部 must ,must_not,filter,should 之间为与的关系

以下查询条件为:

  • address 分词匹配 244 Columbus Plac 且 age = 29

GET bank/_search
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“address”: “244 Columbus Place”
}
},
{
“match”: {
“age”: 29
}
}
]
}
}
}

标记数据匹配的条件

查询结果还可以标记当前记录,匹配上了哪些条件
在查询中,指定查询条件值时:
_name标记当前条件
实际测试下来,不同查询方式,写法还不太一样

  • term

“term”: {
“age”: {
“value”: “30”,
“_name”: “age”
}
}

  • terms

“terms”: {
“age”: [“30”],
“_name”: “age”
}

  • match

“match”: {
“name”: { 字段名
“query”: “四”,
“_name”: “name”
}
}

在这里插入图片描述
可以看到最后有一个 matched_queries字段,说明本条记录是匹配了哪些条件。
但是,这个机制好像对嵌套查询没效果,后续有机会再了解

bool 子元素区别
  • must: 与 (内部做与运算)
  • must_not:非(内部做 与 运算,最后在外层做非运算)不进行相关性评分,不影响整体评分
  • should:或 (内部做 或运算)
  • filter 过滤器,单纯过滤,先于 上述条件执。,不进行相关性评分,不影响整体评分,会使用过滤器缓存。速度更快。
    每个元素内部,还可以嵌套复杂条件(再来一层bool)
boosting 查询(人为降低指定条件得分)

在bool查询中,我们的查询结果是将 bool 内部的所有条件做 与运算
所有都匹配的数据会查出来,并根据相关性进行计分,默认倒序排列。
boosting 查询,则是
先根据 positive下的条件查询结果并得出一个初始评分,
再根据negative 下的条件匹配查询结果,如果匹配上了,则再根据negative_boost的值对其进行降分的处理,使其排名降低。

boosting 查询

GET /stu/_search
{
“query”: {
“boosting”: {
“positive”: {
“match_phrase”: {
“name”: {
“query”: “张三”,
“_name”: “name”
}
}
},
“negative”: {
“term”: {
“age”: {
“value”: “30”,
“_name”: “age”
}
}
},
“negative_boost”: 0.2
}
}
}

简单总结,就是 以 positive 查询数据,再以 negative + negative_boost 对结果降分

constant_score 查询(固定得分)

普通的查询相关性分数是es根据相关性确定的,在此基础上,我们可以通过boosting查询降低匹配特定指标的分数。
还有一种,我们可以返回固定分数。
通过前面的学习,我们知道在 bool 查询中 filter 和 must_not 是不计算分数的;因此 constant_score查询其实就是通过 filter查询,然后为其指定固定分数实现。

constant_score 查询

GET /stu/_search
{
“query”: {
“constant_score”: {
“filter”: { # 查询条件
“term”: {
“age”: “30”
}
},
“boost”: 1.2 # 固定分数
}
}
}

dis_max 查询(单条件 最高分)

其他查询,最终得分是由所有query综合得分构成。
而dis_max 查询只取评分最高的那一项查询,而忽略其他条件的评分
以下条件查询 name 匹配 张三 或者 hobbies 包含 book 的用户

GET /stu/_search
{
“query”: {
“dis_max”: {
“queries”: [
{
“match”: {
“name”: “张三”
}
},
{
“match”: {
“hobbies”: “book”
}
}
]
}
}
}

得到以下得分

“hits” : [
{
“_index” : “stu”,
“_type” : “_doc”,
“_id” : “jToE7YgBKFUjhQBivmyC”,
“_score” : 0.9983525,
“_source” : {
“id” : 1,
“name” : “张三”,
“age” : 10,
“hobbies” : [
“swimming”,
“walk”,
“drive”
],
“address” : [
{
“province” : “500”,
“city” : “023”,
“county” : “1991”
},
{
“province” : “501”,
“city” : “024”,
“county” : “1992”
}
]
}
},
{
“_index” : “stu”,
“_type” : “_doc”,
“_id” : “jzoE7YgBKFUjhQBi_2zu”,
“_score” : 0.9808291,
“_source” : {
“id” : 3,
“name” : “张三四”,
“age” : 30,
“hobbies” : [
“movie”,
“book”,
“swimming”
],
“address” : [
{
“province” : “600”,
“city” : “021”,
“county” : “1887”
},
{
“province” : “601”,
“city” : “073”,
“county” : “1953”
}
]
}
}
]

条件得分
张三_name0.9983525
张三_hobbies0
张三四_name0.8416345
张三四_hobbies0.9808291

可以看到,第一条记录虽然只匹配上了 name = 张三,但是它的得分是 0.9983525,
而第二条记录虽然匹配上了两个条件 ,但是单算 name = 张三四 的评分只有 0.8416345,而 单算 hobbies 含有 book 的得分为 0.9808291,因此第二条记录采用了 较高匹配度的 hobbies 的得分。
总体算下来,低于第一条

算上其他 query 的得分

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

1712516002681)]
[外链图片转存中…(img-RDPvbCHl-1712516002681)]
[外链图片转存中…(img-fk26xN1H-1712516002682)]
[外链图片转存中…(img-A9gUY8N1-1712516002682)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-3P1nXUhm-1712516002682)]

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值