ES的复杂查询(三)
  TEZNKK3IfmPf 2023年11月12日 16 0
  1. 将之前的索引删掉

ES的复杂查询(三)

  1. 创建一个新的 student 索引

ES的复杂查询(三)

  1. 创建一个映射关系

多添加了

ES的复杂查询(三)

  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

ES的复杂查询(三)

字段

含义

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 ‘%霖%’

ES的复杂查询(三)

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

ES的复杂查询(三)

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

ES的复杂查询(三)

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

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

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

ES的复杂查询(三)

二.四 关键字精确查询

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

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

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

类似于 name =“泽霖”

ES的复杂查询(三)

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

ES的复杂查询(三)

三.五 多字段精确查找

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

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

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

ES的复杂查询(三)

二.六 指定查询字段

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

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

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

ES的复杂查询(三)

二.七 过滤字段

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

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

二.七.一 includes 显示字段

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

ES的复杂查询(三)

二.七.二 excludes 不显示字段

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

不显示 name 和 nickname

ES的复杂查询(三)

二.八 组合查询

使用 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

ES的复杂查询(三)

二.九 范围查询

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

range 允许的字符

操作符

说明

gt

>

gte

>=

lt

<

lte

<=

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

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

类似于: age between 25 and 30

ES的复杂查询(三)

二.十 模糊查询

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

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

  • 更改字符(box → fox)
  • 删除字符(black → lack)
  • 插入字符(sic → sick)
  • 转置两个相邻字符(act → cat)

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

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

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

ES的复杂查询(三)

添加 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

ES的复杂查询(三)

二.十一.二 多字段排序

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

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

类似于 _score desc , age asc

ES的复杂查询(三)

二.十二 高亮查询

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

ES的复杂查询(三)

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":{}
        }
    }
}

高亮一下 岳 进行查询

ES的复杂查询(三)

二.十三 分页查询

使用 from ,size 进行处理

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

size:每页显示多少条

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

类似于 limit 1, 2

ES的复杂查询(三)

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 进程间的通信 下一篇: librime引擎研究
  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   226   0   0 查询mysql
  TEZNKK3IfmPf   2024年05月17日   49   0   0 查询mysql索引
  TEZNKK3IfmPf   2023年11月14日   22   0   0 查询
  TEZNKK3IfmPf   2023年11月14日   52   0   0 查询
  TEZNKK3IfmPf   2024年05月31日   32   0   0 select查询
TEZNKK3IfmPf