前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch从入门到放弃:再聊搜索

Elasticsearch从入门到放弃:再聊搜索

作者头像
Jackeyzhe
发布2020-07-14 16:14:17
4410
发布2020-07-14 16:14:17
举报
文章被收录于专栏:代码洁癖患者

前文中我们曾经聊过搜索文档的方法,Elasticsearch 一般适用于读多写少的场景,因此我们需要更多的关注读操作。

Elasticsearch 提供的 Search API 可以分为 URI Search 和 Request Body Search 两大类。从名称上可以直观的看出,URI Search 是使用URI的参数传递参数给 Elasticsearch,Request Body Search 则是将参数放到 Body 中进行传递,下面我们具体来看一下。

URI Search

首先我们来看 URI Search 的一些参数。

  • q 指定查询语句,其使用的是 Query String Syntax
  • df 指定默认字段,如果不指定,则会查询全部字段
  • Sort 对哪些字段进行排序
  • from/size 用于分页

此外,我们还可以通过在请求体中指定 profile 参数来查看查询是如何被执行的。

你可以在Kibana中执行下面的查询来看一下 Elasticsearch 的查询是怎样执行的。

代码语言:javascript
复制
GET /movies/_search?q=2012
{
  "profile": "true"
}

GET /movies/_search?q=title:2012
{
  "profile": "true"
}

GET /movies/_search?q=2012&df=title
{
  "profile": "true"
}

在上面这组查询中,当我们指定了查询字段时, Elasticsearch 使用的 query type 是Term Query。

term query

与之对应的还有 Phrase Query。

Term

如果我们的查询条件是 title:(Code Review),那么它使用的就是 Term Query,它等价于查询 title 中存在 Code 或 Review 的文档。

Phrase

如果我们的查询条件是title:"Code Review"这样用引号引起来的,那么它使用的就是 Phrase Query,它等价于查询同时存在 Code 和 Review 的文档,并且 Code 出现的顺序必须在 Review 之前。

这里你可能会有疑问,为什么 Term Query 前后需要加括号,这是 Elasticsearch 中的分组概念,如果想要像我们说的那样,在 titile 字段中查找存在 Code 或 Review 的文档,那么就必须把它们作为一个分组进行查询。这里你可以自己动手试一下不加括号的情况,看一下 Elasticsearch 会如何执行。

Term Query 中还提供了很多种查询语法,例如我们可以只用 AND、OR、NOT 这样的字符进行布尔操作(需要注意它们都必须大写),也可以使用加号或减号表示 must 和 must not 的概念。同时区间、通配符、甚至是正则表达式查询。

Request Body Search

介绍完 URI Search,我们再一起学习一下 Request Body Search,其实在 Elasticsearch 中,Request Body Search 是更加常用的查询方式。因为它能够支持更多高阶的使用方法。

在 Request Body Search 中,我们同样是用 fromsize 来进行分页,默认的是从0开始,返回10个结果。

排序的方法也是使用 sort,一般建议在“数字型”或“日期型”字段上进行排序。

对于一些字段比较多的文档,我们并不是每次查询都需要全部的字段,这时候就可以在 body 中加上_source 字段来进行过滤。_source字段可以支持通配符,例如_source:["name*"],查询中就只会返回字段名是 name 开头的字段。

前面我们聊了 Term Query 和 Phrase Query,在 Request Body Search 中,我们使用 Match Query 来进行类似的操作。

代码语言:javascript
复制
GET /movies/_search
{
  "query": {
    "match": {
      "title": "Lord Rings"
    }
  }
}

在这个例子中,Elasticsearch 会帮我们查询的是 title 中有 Lord 或 Rings 的文档,如果想要查询 Lord 和 Rings,我们需要用到 operator 来进行修改。

代码语言:javascript
复制
GET /movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Lord Rings",
        "operator": "and"
      }
    }
  },
  "profile": "true"
}

如果要使用 Phrase 查询,只需要把上面的 match 替换为 match_phrase 即可。

在 Phrase 查询中,可以使用 slot 参数来指定可以插入在中间的单词数量。

代码语言:javascript
复制
GET /movies/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "Lord Rings",
        "slop": 2
      }
    }
  },
  "profile": "true"
}

总结

本文我们学习了 Elasticsearch 的两种查询方法:URI Search 和 Request Body Search 。这里更加推荐使用 Request Body Search,因为它可以支持很多高阶用法,这里我们只介绍了一些比较常用的查询方法,包括 Term Query 和 Phrase Query,也介绍了一些字段的用法,包括分页、排序、过滤字段等。当然,Elasticsearch 的 Request Body Search 还支持很多其他参数,由于篇幅限制,就不再一一介绍了,大家在使用时可以自行查阅官方文档。

最后多说一句,关于 Elasticsearch,我也是刚刚接触,欢迎志同道合的同学一起交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码洁癖患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • URI Search
    • Term
      • Phrase
      • Request Body Search
      • 总结
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档