上一篇文章已经和用ID来发送GET请求来对ElasticSearch的数据进行了特定数据的查询,但ES的强大肯定不会只是有这样简单的API,它有着自己的查询语法来满足多种多样的业务场景,这次就大家介绍下。
官方文档对此的解释:ES提供基于JSON的完整查询Domain Specific Language(特定域语言)来定义查询,其主要由两种类型的句子组成:
1.叶查询子句:叶查询子句查找特定字段中的特定值,例如匹配、术语或范围查询。这些查询可以自己使用。
2.复合查询子句:复合查询子句包装其他叶子或复合查询,并用于以逻辑方式组合多个查询(如bool或dis_max查询),或更改其行为(如constant_score查询)。
怎么样,是不是感觉命名方式和解释很像树?
依旧先从基础_search的查询
开始带大家逐步深入。
GET http://localhost:9200/_search?q = MI
上面这个句子非常简单,其中的_search就是ES的语法的搜索关键字,q指代查询内容,这个句子的意思就在所有的Index和Document中查询含有MI的数据。没错,就是全文搜索。这个语法其实已经是省略的写法了,完整写法应该在_search前面还要再加上/_all/这个层级,如果我们在url中指定某个Index,则会去特定的Index进行检索,就是将_all替换成Index名称,比如:
GET http://localhost:9200/goods/_search?q = MI
也可以使用通配符*和+、-,通配符相信大家都能理解,+和-也很容易理解,就是加上特定的Index或者排除某个Index,比如:
GET http://localhost:9200/good*,-goods,+goods/_search?q = MI
需要注意的是,多个符号之间需要使用,隔开。同样可以想象到,对复数个Index进行查询的时候只需要将多个Index名称用逗号隔开即可!
其中还有三个关键字需要解释下:
1.ignore_unavailable:是否忽略任何指定的Index不可用的状态,这包括不存在的Index或关闭的Index。可以指定true或false。
2.allow_no_indices:如果通配符索引表达式没有找到对应的的Index,是否失败,同样指定true或false。例如,如果指定了通配符表达式good*,并且没有以good开头的Index,那么根据这个设置,请求将失败。当_all、*或没有指定Index时,此设置也适用。这种设置也适用于别名,以防别名指向一个关闭的Index。
3.expand_wildcards:扩展到哪种具体Index通配符表达式。如果指定了open,则通配符表达式将扩展为仅开放的Index;如果指定了closed,则通配符表达式将仅扩展为关闭的Index。也可以指定两个值(打开、关闭)以展开到所有索引。
如果没有指定通配符,则将禁用通配符展开,如果全部指定,通配符表达式将扩展到所有Index(这相当于指定open、closed)。
ES还提供了根据日期和时间搜索Index的功能
假设我们有一些订单数据,而这些数据是去年的,我们可以将Index名称定义为:orders-2017.12.31,这样就一目了然知道,对于这样的名称,我们可以使用特定的语法进行检索,下面是官方的示例:
<static_name{date_math_expr{date_format|time_zone}}>{date_math_expr{date_format|time_zone}}> http://localhost:9200/<orders-{now-2d{YYYY.MM.dd|utc}}>/_search
static_name从命名可以看出来是静态的,表示Index名称中不变的部分;date_math_expr是一个动态日期匹配表达式;date_format:日期格式;time_zone:时区;
翻译下面的例子:检索名称以orders-开头的、日期以现在开始减去两天的、格式是YYYY.MM.dd的、以UTC时间进行计算的Index!今天18年9月1号,那么这个句子就会返回orders-2018.08.30这个Index。
其他的语法还有now-M啊,now-Y啊,now{YYYY/MM}等等不一一示范了。
本来想稍微说一说的……结果一不小心一大篇下来只是讲解了一些参数含义以及关键字_search……还没涉及到ES的查询语法,只能后面再继续了,希望大家多多支持。
版权所属,如需转载,请注明出处:搜闲鱼