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

前文中咱们曾经聊过搜索文档的方法,Elasticsearch 通常适用于读多写少的场景,所以咱们须要更多的关注读操做。web

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 对哪些字段进行排序flex

  • from/size 用于分页spa

此外,咱们还能够经过在请求体中指定 profile 参数来查看查询是如何被执行的。.net

你能够在Kibana中执行下面的查询来看一下 Elasticsearch 的查询是怎样执行的。3d

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。code

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 来进行相似的操做。

GET /movies/_search
{
  "query": {
    "match": {
      "title""Lord Rings"
    }
  }
}

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

GET /movies/_search
{
  "query": {
    "match": {
      "title": {
        "query""Lord Rings",
        "operator""and"
      }
    }
  },
  "profile""true"
}

若是要使用 Phrase 查询,只须要把上面的 match 替换为 match_phrase 便可。

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

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,我也是刚刚接触,欢迎志同道合的同窗一块儿交流。

往期精彩回顾
Elasticsearch从入门到放弃:分词器初印象
Elasticsearch从入门到放弃:文档CRUD要牢记
Elasticsearch从入门到放弃:索引基本使用方法
Elasticsearch从入门到放弃:人生若只如初见

本文分享自微信公众号 - 代码洁癖患者(Jackeyzhe2018)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索