本文的目的是介绍Oracle查询语句的详细情况,特别关注oracle查询语句会锁表吗的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Oracle查询语句的机会,同时也
本文的目的是介绍Oracle 查询语句的详细情况,特别关注oracle查询语句会锁表吗的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Oracle 查询语句的机会,同时也不会遗漏关于19 个很有用的 ElasticSearch 查询语句 篇一、19 个很有用的 ElasticSearch 查询语句 篇二、40+ 个非常有用的 Oracle 查询语句、45 个非常有用的 Oracle 查询语句的知识。
本文目录一览:- Oracle 查询语句(oracle查询语句会锁表吗)
- 19 个很有用的 ElasticSearch 查询语句 篇一
- 19 个很有用的 ElasticSearch 查询语句 篇二
- 40+ 个非常有用的 Oracle 查询语句
- 45 个非常有用的 Oracle 查询语句
Oracle 查询语句(oracle查询语句会锁表吗)
SQL是结构化查询语言( Structured Query Language)的缩写,它是目前关系数据库系统中通用的标准语言。
SQL在字面上虽然称为结构化查询语言,实际上它还包括数据操纵、数据定义、事务控制、安全控制等一系列命令。
SQL操作的基本对象是表,也就是关系。
它可以对表中的数据进行查询、增加、删除、修改等常规操作,还可以维护表中数据的一致性、完整性和安全性,能够满足从单机到分布式系统的各种应用需求。
SQL是一种非过程化的语言,用户在使用SQL操作数据时,只需要告诉系统做什么,而不需要关心怎么做,系统会根据用户的意图自动完成相应的操作。
由于SQL的这一特点,它被人们称为“第四代语言”(4GL ),以区别于面向过程的高级语言。
用SQL语言编写的SQL语句有两种执行方式,一种是联机交互方式, SQL语句在一定的平台上执行,例如数据库管理系统提供的实用程序。
这个执行平台将SQL语句提交给数据库服务器,并将从数据库服务器返回的执行结果显示给用户。
另一种方式是嵌入方式,用户在用C/C++ 、Java等高级语言编写应用程序时,可能需要操作数据库中的数据,这时SQL作为一种嵌入式语言,嵌入到高级语言程序中,通过数据库接口;如ODBC 、JDBC访问数据库中的数据。
SQL包括一系列命令,可以满足对数据的各种访问。
按照通用的分类标准, SQL命令分为以下几种类型:
·查询命令包括SELECT命令
•DML命令包括INSERT 、DELETE 、UPDATE命令
•DDL命令包括CREATE 、D·ROP 、ALTER 、RENAME 、TRUNCATE命令
·事务控制命令包括COMMIT 、ROLLBACK 、SAVEPOINT命令
•DCL命令包括GRANT 、REVOKE命令
命令和相关的参数一起构成了SQL语句。
查询语句
查询语句是使用最为频繁的数据库访问语句,对应的SQL命令是SELECT 。
虽然只有一条命令,但是由于它有灵活多样的形式,以及功能强大的子句,可以组成各种复杂的查询语句,能够完成各种复杂的查询。
SELECT语句可以根据用户的要求查询数据库中的数据,并且可以对它们进行简单的计算和统计。
最简单的SELECT语句只有一个FROM子句,格式如下:
SELECT 表达式 FROM 表名称;
其中SELECT之后引导一个或多个列名,或者表达式,用来指定需要查询的列,或者对数据所进行的计算。
在FROM子句指定一个或多个表名,用来指定本次查询所涉及的表。
查询的结果是返回一行或多行数据,每行由一个或多个列的列值组成。
完整的SELECT语句包括WHERE 、ORDER 、GROUP等子句。格式如下:
SELECT 表达式
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 表达式
SELECT语句最灵活的用法体现在WHERE子句中的查询条件,这个条件用来指定查询什么样的数据。
查询语句的基本用法
如果要查询某个表中一个或多个列的数据,需要在SELECT 命令之后指定列名,并在FROM子句中指定查询所涉及的表。
格式如下:
SELECT 列名称列表 FROM 表名称;
查询的结果是从指定的表中将指定列的数据显示出来。
这样的语句可以在Oracle提供的实用工具SQL*Plus 中执行,也可以在其他实用工具或应用程序中执行。
SQL语句中除字符串外,各个部分是大小写不敏感的。
如果在SQL*Plus 中执行SQL语句,还要在语句末尾加上一个分号。
分号并不是SQL语句的一部分,只是语句结束的标志。
一条句可以在一行中书写,也可以分行书写。
如果要查询表中的所有的列,可以用“*”符号代替所有的列名。
如果不了解表的结构,可以在SQL*Plus 中执行命令DESCRIBE (简写为DESC ),查看表的结构。
这个命令的参数是表名,或者其他对象名。
注意,这条命令不是SQL 命令,而是SQL*Plus 中的命令。
在默认情况下,在显示数据时,各列的标题就是列的名称。
在SELECT语句中可以定义列的别名,这样在显示数据时,列的标题就是这个别名,在整个SQL语句中都可以使用这个别名。
使用别名的SELECT语句格式为:
SELECT 列1 AS 别 名1 ,列2 AS 别名2 •••
或者在列名后直接指定别名,省略AS 关键字。
在查询结果中如果有重复行,可以使用DISTINCT关键字去掉重复行的显示。
重复行是指在SELECT语句中涉及的所有列的列值完全相同的行。
SELECT语句不仅可以进行简单的查询,还可以对查询的列进行简单的计算,也可以在两个列之间进行计算,或者将某个列与其他表达式,或者两个表达式进行计算。
使用||运算符可以将两个数据连接起来。
无论是数字型还是日期型数据,在进行这种运算时,都可以看做是字符型数据。
通过||运算符,用户可以设计自己喜欢的数据显示方式,如将两个列的值连接起来,也可以将列的值与其他文字连接起来。
连接以后所得的数据可以当做一个列来显示。
如果在SQL语句中使用了字符串,必须用一对单引号将字符串限定,并且字符串中的字符是大小写敏感的。
加减乘除四则运算在SELECT语句中比较简单,需要住意的是空值的计算。
空值与其他数据进行四则运算时,结果将得到空值,而不管它与什么样的数据运算。
为了解决空值的计算问题, SQL提供了一个函数,这个函数是NVL ,它的功能是把空值转换为其他可以参加运算的数据。
这个函数的调用格式是:
NVL (表达式,替代值)
当表达式的结果为空时,这个函数就把表达式的值用指定的值代替。
SELECT命令还可以用来计算一个普通表达式的值,这个表达式可能与表没有任何关系。
为了解决表达式与表无关的问题,Oracle提供了一个特殊的表dual。
查询语句中的条件
如果希望只查询一部分行,那么可以通过WHERE子句指定条件。WHERE子句的作用是通过指定条件,使SELECT语句仅仅查询符合条件的行。
在更多情况下,都需要根据指定的条件对数据进行查询。
WHERE子句指定的条件是一个关系表达式,如果关系表达式的结果为真,则条件成立,否则条件不成立。
关系表达式用于比较两个表达式的大小,或者进行模糊匹配,或者将一个表达式的值与一个集合中的元素进行匹配。
关系运算符
=!=>=<=
LIKE
IN
BETWEEN
AND OR
NOT
IS NULL
LIKE运算符通常用来进行字符串的模糊匹配,而“=”运算符只能对字符串进行精确比较。
在LIKE指定的关系表达式中可以使用两个通配得:%和_,其中%可以代替多个字符,_可以代替一个字符。
注意,%用来代替多个连续的字符,包括空字符串,而_只能用来代替一个字符,包括空字符。
IN运算符用来与一个集合中的元素进行比较。
SELECT语句将指定的表达式与集合中的元素一一比较,只要与其中-个相等,则条件成立。
如果没有任何一个元素与表达式的值相等,则条件不成立。
BETWEEN运算符用于将表达式的值与两个指定数据进行比较,如果表达式的值在这两个数据之间,则条件成立。
这两个数据和表达式必须能够比较大小,而且后一个数据必须大于前一个数据。
在复杂的查询语句中,可能需要多个条件,这些条件通过AND或OR运算符连接。
多个条件表达式连接起来以后,就构成一个逻辑表达式。
逻辑表达式的结果要么为真,要么为假,它是与两个关系表达式的值和所使用的连接运算有关的。
NOT运算符的作用是对关系表达式的值取反。
它的用法是在关系表达式之前加上NOT运算符。
注:取反运算符- 是对数值型数据取反。
在默认情况下, NOT运算符只对最近的一个关系表达式取反,如果要对已经通过AND或OR连接的多个关系表达式同时取反,则要用一对圆括号将多个关系表达式限定。
在WHERE子句中构造条件时,还要注意空值的运算。空值与任何数据进行赋值运算、四则运算以及关系运算时,结果都为空值。
查询语句中的单行函数
在SELECT语句中不仅可以对数据进行前面讲述的各种运算,还可以把数据作为函数的参数,进行其他的计算。
所谓单行函数,就是分别作用于查询结果中的每一行,对于每一行,分别得到一个计算结果。
这些函数都是Oracle提供的系统函数,用户可以在SELECT语句或其他SQL语句中直接使用它们。
Oracle提供的函数很多,这里仅仅把最常用的函数进行分类介绍。
在函数中处理的数据可以是某个列的列值,也可以是某个表达式。
1.字符串处理函数
顾名思义,这类函数以字符串为处理对象,处理的结果是另一字符串或者一个数字。
(1)CONCAT函数
这个函数的参数是两个字符串,计算的结果是将两个字符串连接在一起,生成一个新的字符串。
例如
SELECT CONCAT(''A'', ''B'') FROM dual;
(2)CHR与ASCII函数
CHR函数的参数是一个正整数,它将这个正整数作为ASCII码,返回对应的字母。
ASCII 函数的作用正好相反,它以一个字符为参数,返回这个字符对应的ASCII码。
例如:
SELECT CHR(32), ASCII(''A'') FROM dual;
(3)INSTR函数
这个函数在一个字符串中查找另一个字符串,如果找到,则返回出现的位置,否则返回0,位置的编号从l 开始。
这个函数的语法格式为:
INSTR(字符串, 子字符串, start, occurrence)
其中前两个参数是必需的,这个函数在第一个参数中查找第二个参数,得到的结果是第二个参数在第一个参数中出现的位置,如果没有找到,则返回0 。
后两个参数是可选的,参数start指定从第一个参数的什么位置开始查找,默认从l 开始,即第一个字符。
参数occurrence指定查找子字符串的第几次出现。
(4)LENGTH函数
这个函数的作用是求得一个字符串的长度。
(5)LOWER和UPPER函数
这两个函数的作用是进行字符串的大小写转换,它们的参数都是一个字符串。
其中LOWER 函数将字符串中的字母转换为对应的小写字母, UPPER 函数将字符串中的字母转换为对应的大写字母。
(6)LPAD和RPAD函数
这两个函数的作用是在字符串中填充指定的字符,使字符串达到指定的长度。
LPAD 函数从左边填充, RPAD 函数从右边填充,处理的结果是得到一个新的字符串。
这两个函数的语法格式为:
LPAD(字符串,长度,填充字符)
RPAD(字符串,长度,填充字符)
这两个函数在字符串中填充指定的字符,使其达到指定的长度,默认是填充空格。
如果指定的长度比字符串本来的长度小,则将字符串截断,只保留新的长度。
注:在截断字符串时,都是截断字符串右边的部分。
(7)LTRIM、RTRIM函数和TRIM函数
这三个函数的作用是去掉字符串左边或右边连续的空格,并得到一个新的字符串。
TRIM 函数的作用是同时去掉字符串左边和右边的连续空格,它相当于对字符串先执行LTRIM 函数,再执行RTRIM 函数,或者先执行RTRIM 函数,再执行LTRIM 函数。
注:这三个函数只能去除字符串左边或右边的空格,对于字符串中间的空格是不能去除的。
(8)REPLACE函数
这个函数的作用是在一个字符串中查找另一个字符串,并将找到的字符串用第三个字符串代替。
这个函数的语法格式为:
REPLACE(字符串,子字符串,替换字符串)
如果在字符串没有找到子字符串,则不做任何处理,如果找到,则用替换字符串代替。
如果没有指定替换字符串,就将找到的子字符串从原字符串中删除。
(9)SUBSTR函数
这个函数的作用是根据指定的开始位置和长度,返回一个字符串的子字符串。
它的语法格式为:
SUBSTR(字符串,开始位置,长度)
位置编号从l 开始。
开始位置可以是正整数或负整数。
如果是负整数,则从字符串的右边开始数。
长度是可选的,如果缺省,则返回从开始位置到字符串末尾的所有字符。
注:开始位置是负整数时,从字符串右边开始数,但是长度扔往右边算。
2.数学函数
数学函数的处理对象是数字型数据,处理的结果一般也是数字型数据。
(1)ABS函数
这个函数的作用是求得一个数字的绝对值。
(2)CEIL和FLOOP函数
这两个函数都以一个数字为参数, CEIL 函数返回大于或等于这个数字的最小整数。
FLOOR 函数返回小于或等于这个数字的最大整数。
(3)MOD函数
这个函数有两个参数,结果是两个数相除所得的余数。
(4)ROUND和TRUNC函数
ROUND 函数的作用是对数据进行四舍五入计算。
这个函数的语法结构为:
ROUND(数据,舍入位置)
其中舍入位置可以是正整数,也可以是负整数。
如果是正整数,则从小数点开始向右数,一直到舍人位置,从这一位开始四舍五入。
如果是负整数,则从小数点开始向左数,然后进行四舍五入。
TRUNC 函数的用法与ROUND 函数类似,只不过它的功能是对数据进行截取运算,只舍不入,也就是把一个数据的指定位之后的数字全部舍去。
3.日期型函数
日期型函数的处理对象是日期型数据,处理的结果一般也是日期型数据。
(1)ADD_MONTHS函数
这个函数在某个日期的基础上,加上一个指定的月数,返回一个新的日期。
它的格式为:
ADD_MONTHS(日期,月数)
这个函数是在指定的日期上加上若干个整月数,所以日期中的日应该保持不变。
但是指定的日期如果是当月的最后一天,函数会做相应的调整,以保证返回的日期也是当月的最后一天。
在ADD_MONTHS 函数中,不能直接使用类似“ 12-05-1 。”这样的日期型数据,因为Oracle把这样的数据是当做字符串来处理的,所以首先要调用to_date 函数将它转换为真正的日期型数据。
(2)LAST_DAY函数
这个函数返回指定日期所在月份的最后一天。
(3)MONTHS_BETWEEN函数
这个函数有两个参数,都是日期型数据,返回的结果是两个日期之间相差的月数。
这个函数的语法格式为: months_between (日期1 ,日期2 )。
如果两个日期中的日相同,或者都是当月的最后一天,则返回结果是一个整数,否则将返回一个小数。
第一个参数如果比第二个参数小,则返回的结果为负数。
(4)NEXT_DAY函数
这个函数有两个参数,一个是日期,一个是与星期几对应的整数,返回的结果是这个日期之后最近的星期几所对应的日期。
函数的调用格式为:
NEXT_DAY(日期,整数)
(5)ROUND函数
这个函数对指定的日期进行四舍五入处理。
它有两个参数,一个是日期,一个是表示日期某个组成部分的格式字符串。
函数的语法格式为:
ROUND(日期,格式字符串)
其中格式字符串用于指定从日期的哪一部分开始四舍五入。
Oracle支持的格式宇符串包括yy (或yyyy )、mm 、dd 、hh ,分别表示从年、月、日、时位进行四舍五入。
(6)SYSDATE函数
这是个很常用的函数,它用来获得系统当前时间。
在有些日志操作中,常常需要记录当前时间,使用这个函数是很方便的。
这个函数没有任何参数。
这个函数返回的时间可以精确到秒,但在显示时可能只显示到日,根据系统的不同显示格式有所变化。
如果希望得到时、分、秒,则需要通过to_char 函数进行数据类型转换。
(7)TRUNC函数
这个函数的功能类似于ROUND 函数,但是它不进行四舍五入,而是从指定位开始,截断其后面的部分,它的语法格式与ROUND 函数相同。
类型转换函数
在进行数据处理时,常常需要对数据进行类型转换。
数据类型转换主要涉及字符型、数字型和日期型数据之间的相互转换, 涉及的函数有to_char 、to_date和to_number 。
(1)TO_CHAR
to_char函数的作用是将一个日期型或者数字型数据转换为字符串。
如果操作对象是日期型数据,这个函数的语法格式为:
TO_CHAR(日期,格式字符串)
其中格式字符串是由日期格式元素和隔离符号组成的字符串,用来规定转换的格式。
如果没有指定格式字符串,则按照当前系统默认的时间格式转换为字符串。
格式元素 说明
-/| 日期中不同部分的分隔符。实际上除数字、字母以外的任何可显示字符都可以作为分隔符
yyyy yy 年的表示。其中yyyy表示4位数的年. yy表示两位数的年
month mon mm 月的表示。month表示月份的全称。mon表示月份名称的缩写。mm表示两位数字的月份
dd ddd 日的表示。dd表示两位数字的日. ddd表示在一年中的编号
d dy day 星期的表示。d表示数字编号, dy 表示星期的缩写, day星期的全称
hh hh24 小时的表示,分别表示12小时制和24小时制
am pm 分别表示12小时制中的上午和下午
mi SS 分别表示两位数的分、秒
如果操作对象是数字型数据, to_char 函数的语怯格式为:
TO_CHAR(数字,格式字符串)
其中格式字符串是由数字格式元素和小数点、分隔符组成的字符串,用来控制转换的格式。
这种转换主要用在财务报表中。
(2)TO_DATE函数
这个函数的作用是把一个字符串转换为一个日期型数据,它有两个参数,处理的结果是一个日期型数据。
这个函数的语法格式为:
TO_DATE(字符串,格式字符串)
格式字符串中的每部分对字符串中的每部分是一一对应地进行解释的,所以日期字符串中的每一部分对于格式字符串中的对应部分来说,必须是合法的数据。
(3)TO_NUMBER函数
这个函数的作用是把一个字符串转换为数字,它有两个参数,处理的结果是一个数字型数据。
这个函数的语法格式为:
TO_NUMBER(字符串,格式字符串)
格式元素 说明
, 格式化数字中逗号的位置
. 小数点的位置
9 代表一位十进制数
0 代表一位十进制数,当对应位没有数字时,以0填充
$ 在数字前面加上$符号
L 在数字前面加上本地货币符号
分组函数与分组统计
分组函数又称为聚集函数,是一种多行函数。
之所以称为多行函数,是与单行函数对应的,因为这种函数对多行数据一起进行计算,只返回一个结果,而不是每行都返回一个结果。
聚集函数主要用来进行数据的统计,常用的聚集函数有以下几个:
•AVG 求平均值
•MIN 求最小值
•MAX 求最大值
•SUM 求和
•COUNT 计数
(1) AVG 函数
AVG 函数用来求指定列上的平均值,它将自动忽略列上的空值。
如果要去掉重复值的计算,可在列名前加上DISTINCE选项。
(2) MIN与MAX 函数
MIN 函数的作用是求指定列的最小值, MAX 函数的作用是求指定列的最大值。
这两个函数都自动忽略空行。
(3) COUNT 函数
COUNT函数用来计算数据的行数。
在默认情况下,这个函数不计算空行。
如果要计算空行,可以用“*”代替列名。
如果要去掉重复值的计算,可在列名前加上DISTINCE选项,这样如果遇到重复值,只计算一次。
(4) SUM 函数
SUM 函数的作用是对指定列求和,它将自动忽略空值。
如果要去掉重复值的计算,可在列名前加上DISTINCE选项。
2.分组统计
分组函数最常见的用法是与GROUP子句一起使用,用来对表中的数据进行分组统计。
GROUP子句的语法格式为:
GROUP BY 列 1 ,列 2 •••
GROUP子句根据指定的列对数据进行分组统计。
首先根据第二个列进行分组统计,第一个列相同时再进一步根据第二个列进行分组统计。
与GROUP子句一起使用的还有一个子句,即HAVING子句。
这个子句是可选的,它不能单独使用,只能配合GROUP子句使用,作用是对GROUP子句设置条件,对统计后的结果进行限制。
HAVING子句中的关系表达式必须使用分组函数,可以是在SELECT语句中己经出现的分组函数,也可以是没有出现的函数。
虽然HAVING子句和WHERE子句都是用来设置条件的,但是WHERE子句设置的条件是在查询时起作用的,它决定b,如果要进行统计,这样的条件是在统计之前就已经起作用了。
而HAVING子句设置的条件只有在进行统计后才起作用,它决定了对于统计产生的数据,哪些需要显示给用户。
数据的排序
SELECT语句可以使用的最后一个子句是ORDER子句。
以前在查询数据时,数据显示的顺序是不可预知的。
如果要对数据进行某种方式的排序,就要借助于ORDER子句。
ORDER子句的语法格式为:
ORDER BY 列1 排序方式,列2 排序方式...
ORDER子句对查询到的数据按照指定列的大小排序。
如果指定了多个排序列,则首先按照第一个排序列排序,如果这个列的值相同,则再按照第二个排序列继续排序。
排序方式包括ASC 和DESC ,分别表示升序排序和降序排序,二者可选其一,默认的排序方式是升序排序。
如果指定了多个排序列,可以为每个排序列单独指定排序方式。
ORDER子句中的排序列可以是列名,可以是列的别名,也可以是其他的表达式,还可以
是它在SELECT语句中的排列序号。
如果在SELECT语句中用到了所有的子句,那么将构成一条复杂的SQL语句。
这些子句的使用顺序是: WHERE子句、GROUP子句、HAVING子句、ORDER子句。
多表查询
以前讲述的查询语句都只涉及一个表的数据。
在很多情况下 ,需要查询的数据往往涉及多个表,这时需要对多个表进行连接查询。
表间的连接关系有相等连接、非相等连接、外连接和子连接等多种形式,其中最常用的连接形式是相等连接。
相等连接体现在WHERE子句中指定的条件上,在条件中要指定两个表通过哪些列进行连接。
一般情况下进行连接查询的两个表是通过主键和外键进行关联的,所以最简单的条件是一个表的外键与另一个表的主键相等。
如果一个列在两个表中同时存在,那么在SELECT语句中要用表名进行限定(表名. 列名或者表的别名.列名),否则系统将无法确定是哪个表中的列。
在构造查询语句时,首先要仔细分析这个查询要涉及哪些表,
以及这些表通过哪些列进行连接,然后在SELECT语句中指定所有涉及的表,在WHERE子句中指定连接条件。
外连接是一种特殊的连接方式。
假设有两个表A和B ,用相等连接查询可以返回表A中的所有行,而表B 中的部分行因为不满足相等条件,所以是不会被查询到的,但是利用外连接可以返回表B中的所有行。
对于表A和B来说,外连接的条件表达式的格式为:
WHERE A. 列名(+)= B. 列名
如果要显示表B 中所有行,包括使用相等连接无法显示的行,则在表A的列名之后指定外连接的标志“(+)”。
自连接是一种特殊的相等连接。相等连接一般涉及多个不同的表,白连接也涉及多个表,但是它们是同一个表。
由于要把同一个表看成两个不同的表进行连接,所以在FROM子句中要为表定义两个不同的别名。
子查询
子查询就是嵌套在另一个SELECT语句中的查询。
在SELECT语句中, WHERE子句或者HAVING子句中的条件往往不能用一个确定的表达式来确定,而要依赖于另一个查询,这个被嵌套使用的查询就是子查询,它在形式上是被一对圆括号限定的SELECT语句。
在子查询中还可以再嵌套子查询。
这种复杂的SELECT语句的执行过程为:首先执行子查询,将执行的结果返回给主查询,然后再根据条件执行主查询。
子查询一般出现在SELECT语句的WHERE子句或HAVING子句中,作为条件表达式的一部分。
子查询的结果是返回一行或多行数据,可以被看做一个集合。
条件表达式就是要将某个表达式与这个集合中的元素进行某种比较运算,根据运算的结果是真或是假来决定是否执行上一层查询。
常用的运算符如下:
运算符 用法 说明
EXISTS EXISTS S 如果集合S不为空,条件表达式的值为真,否则为假
IN 表达式 IN S 如果表达式的值在集合S中,则条件表达式的值为真,否则为假
= 表达式=S 如果表达式的值与集合S中唯一一个元素相等,则条件表达式的值为真,集合S必须确保最多只有一个元素
> < <= >= 与=相同 进行相应的关系运算
ANY(SOME) 用在集合名之前 指定要与集合中的任一个元素进行比较
ALL 用在集合名之前 指定要与集合中的所有元素进行比较
其中EXISTS 运算符测试子查询的返回结果,只要结果不为空,条件就为真,而主查询和子查询之间可能没有直接关系。
IN运算符将某个列的值与子查询的返回结果进行比较,只要与其中的一个结果相等,条件即为真。
=”运算符号比较特殊,它将某个列的值与集合中的元素进行精确匹配。
如果子查询只返回单行结果,那么将这个列与这一行进行比较。
如果子查询返回多行结果,那么必须用ANY或ALL进行限定,否则将出错。
ANY运算符的作用是,只要列值与返回结果中的任何一个相等,条件即为真。
ALL运算符的作用是,列值要与返回结果中的所有行都要进行比较。
运算符〉、〈、〉=和〈=与=的用法相似,子查询可以返回单行结果,也可以返回多行结果。
如果是多行结果,必须用ANY或ALL进行限定。
19 个很有用的 ElasticSearch 查询语句 篇一
为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布日期)和 num_reviews(浏览数))。
在这之前,首先我们应该先创建一个新的索引(index),并批量导入一些文档:
创建索引:
PUT /bookdb_index
{ "settings": { "number_of_shards": 1 }}
批量上传文档:
POST /bookdb_index/book/_bulk
{ "index": { "_id": 1 }}
{ "title": "Elasticsearch: The Definitive Guide", "authors": ["clinton gormley", "zachary tong"], "summary" : "A distibuted real-time search and analytics engine", "publish_date" : "2015-02-07", "num_reviews": 20, "publisher": "oreilly" }
{ "index": { "_id": 2 }}
{ "title": "Taming Text: How to Find, Organize, and Manipulate It", "authors": ["grant ingersoll", "thomas morton", "drew farris"], "summary" : "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization", "publish_date" : "2013-01-24", "num_reviews": 12, "publisher": "manning" }
{ "index": { "_id": 3 }}
{ "title": "Elasticsearch in Action", "authors": ["radu gheorge", "matthew lee hinman", "roy russo"], "summary" : "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms", "publish_date" : "2015-12-03", "num_reviews": 18, "publisher": "manning" }
{ "index": { "_id": 4 }}
{ "title": "Solr in Action", "authors": ["trey grainger", "timothy potter"], "summary" : "Comprehensive guide to implementing a scalable search engine using Apache Solr", "publish_date" : "2014-04-05", "num_reviews": 23, "publisher": "manning" }
例子:
1. 基本的匹配(Query)查询
有两种方式来执行一个全文匹配查询:
使用 Search Lite API,它从
url
中读取所有的查询参数使用完整 JSON 作为请求体,这样你可以使用完整的 Elasticsearch DSL
下面是一个基本的匹配查询,查询任一字段包含 Guide 的记录
GET /bookdb_index/book/_search?q=guide
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.28168046,
"_source": {
"title": "Elasticsearch: The Definitive Guide",
"authors": ["clinton gormley", "zachary tong"],
"summary": "A distibuted real-time search and analytics engine",
"publish_date": "2015-02-07",
"num_reviews": 20,
"publisher": "manning"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.24144039,
"_source": {
"title": "Solr in Action",
"authors": ["trey grainger", "timothy potter"],
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"publish_date": "2014-04-05",
"num_reviews": 23,
"publisher": "manning"
}
}
]
下面是完整 Body 版本的查询,生成相同的内容:
{
"query": {
"multi_match" : {
"query" : "guide",
"fields" : ["_all"]
}
}
}
multi_match
是 match
的作为在多个字段运行相同操作的一个速记法。fields
属性用来指定查询针对的字段,在这个例子中,我们想要对文档的所有字段进行匹配。两个 API 都允许你指定要查询的字段。例如,查询 title
字段中包含 in Action 的书:
GET /bookdb_index/book/_search?q=title:in action
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.6259885,
"_source": {
"title": "Solr in Action",
"authors": [
"trey grainger",
"timothy potter"
],
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"publish_date": "2014-04-05",
"num_reviews": 23,
"publisher": "manning"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.5975345,
"_source": {
"title": "Elasticsearch in Action",
"authors": [
"radu gheorge",
"matthew lee hinman",
"roy russo"
],
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"publish_date": "2015-12-03",
"num_reviews": 18,
"publisher": "manning"
}
}
]
然而, 完整的 DSL 给予你灵活创建更复杂查询和指定返回结果的能力(后面,我们会一一阐述)。在下面例子中,我们指定 size
限定返回的结果条数,from 指定起始位子,_source
指定要返回的字段,以及语法高亮
POST /bookdb_index/book/_search
{
"query": {
"match" : {
"title" : "in action"
}
},
"size": 2,
"from": 0,
"_source": [ "title", "summary", "publish_date" ],
"highlight": {
"fields" : {
"title" : {}
}
}
}
[Results]
"hits": {
"total": 2,
"max_score": 0.9105287,
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.9105287,
"_source": {
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
},
"highlight": {
"title": [
"Elasticsearch <em>in</em> <em>Action</em>"
]
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.9105287,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"title": "Solr in Action",
"publish_date": "2014-04-05"
},
"highlight": {
"title": [
"Solr <em>in</em> <em>Action</em>"
]
}
}
]
}
注意:对于多个词查询,match
允许指定是否使用 and
操作符来取代默认的 or
操作符。你还可以指定 mininum_should_match
选项来调整返回结果的相关程度。具体看后面的例子。
2. 多字段(Multi-filed)查询
正如我们已经看到来的,为了根据多个字段检索(e.g. 在 title
和 summary
字段都是相同的查询字符串的结果),你可以使用 multi_match
语句
POST /bookdb_index/book/_search
{
"query": {
"multi_match" : {
"query" : "elasticsearch guide",
"fields": ["title", "summary"]
}
}
}
[Results]
"hits": {
"total": 3,
"max_score": 0.9448582,
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.9448582,
"_source": {
"title": "Elasticsearch: The Definitive Guide",
"authors": [
"clinton gormley",
"zachary tong"
],
"summary": "A distibuted real-time search and analytics engine",
"publish_date": "2015-02-07",
"num_reviews": 20,
"publisher": "manning"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.17312013,
"_source": {
"title": "Elasticsearch in Action",
"authors": [
"radu gheorge",
"matthew lee hinman",
"roy russo"
],
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"publish_date": "2015-12-03",
"num_reviews": 18,
"publisher": "manning"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.14965448,
"_source": {
"title": "Solr in Action",
"authors": [
"trey grainger",
"timothy potter"
],
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"publish_date": "2014-04-05",
"num_reviews": 23,
"publisher": "manning"
}
}
]
}
注:第三条被匹配,因为 guide
在 summary
字段中被找到。
3. Boosting
由于我们是多个字段查询,我们可能需要提高某一个字段的分值。在下面的例子中,我们把 summary
字段的分数提高三倍,为了提升 summary
字段的重要度;因此,我们把文档 4 的相关度提高了。
POST /bookdb_index/book/_search
{
"query": {
"multi_match" : {
"query" : "elasticsearch guide",
"fields": ["title", "summary^3"]
}
},
"_source": ["title", "summary", "publish_date"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.31495273,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.14965448,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.13094766,
"_source": {
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
}
]
注:提升不是简简单单通过提升因子把计算分数加成。实际的 boost
值通过归一化和一些内部优化给出的。相关信息请见 Elasticsearch guide
4. Bool 查询
为了提供更相关或者特定的结果,AND
/OR
/NOT
操作符可以用来调整我们的查询。它是以 布尔查询 的方式来实现的。布尔查询 接受如下参数:
must
等同于AND
must_not
等同于NOT
should
等同于OR
打比方,如果我想要查询这样类型的书:书名包含 ElasticSearch 或者(OR
) Solr,并且(AND
)它的作者是 Clinton Gormley不是(NOT
)Radu Gheorge
POST /bookdb_index/book/_search
{
"query": {
"bool": {
"must": {
"bool" : { "should": [
{ "match": { "title": "Elasticsearch" }},
{ "match": { "title": "Solr" }} ] }
},
"must": { "match": { "authors": "clinton gormely" }},
"must_not": { "match": {"authors": "radu gheorge" }}
}
}
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.3672021,
"_source": {
"title": "Elasticsearch: The Definitive Guide",
"authors": [
"clinton gormley",
"zachary tong"
],
"summary": "A distibuted real-time search and analytics engine",
"publish_date": "2015-02-07",
"num_reviews": 20,
"publisher": "oreilly"
}
}
]
注:正如你所看到的,布尔查询 可以包装任何其他查询类型,包括其他布尔查询,以创建任意复杂或深度嵌套的查询。
5. 模糊(Fuzzy)查询
在进行匹配和多项匹配时,可以启用模糊匹配来捕捉拼写错误,模糊度是基于原始单词的编辑距离来指定的。
POST /bookdb_index/book/_search
{
"query": {
"multi_match" : {
"query" : "comprihensiv guide",
"fields": ["title", "summary"],
"fuzziness": "AUTO"
}
},
"_source": ["title", "summary", "publish_date"],
"size": 1
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.5961596,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
}
]
注:当术语长度大于 5 个字符时,AUTO
的模糊值等同于指定值 “2”。但是,80% 拼写错误的编辑距离为 1,所以,将模糊值设置为 1
可能会提高您的整体搜索性能。更多详细信息,请参阅Elasticsearch指南中的“排版和拼写错误”(Typos and Misspellings)。
6. 通配符(Wildcard)查询
通配符查询 允许你指定匹配的模式,而不是整个术语。
?
匹配任何字符*
匹配零个或多个字符。
例如,要查找名称以字母’t’开头的所有作者的记录:
POST /bookdb_index/book/_search
{
"query": {
"wildcard" : {
"authors" : "t*"
}
},
"_source": ["title", "authors"],
"highlight": {
"fields" : {
"authors" : {}
}
}
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 1,
"_source": {
"title": "Elasticsearch: The Definitive Guide",
"authors": [
"clinton gormley",
"zachary tong"
]
},
"highlight": {
"authors": [
"zachary <em>tong</em>"
]
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 1,
"_source": {
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"authors": [
"grant ingersoll",
"thomas morton",
"drew farris"
]
},
"highlight": {
"authors": [
"<em>thomas</em> morton"
]
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 1,
"_source": {
"title": "Solr in Action",
"authors": [
"trey grainger",
"timothy potter"
]
},
"highlight": {
"authors": [
"<em>trey</em> grainger",
"<em>timothy</em> potter"
]
}
}
]
7. 正则(Regexp)查询
正则查询 让你可以使用比 通配符查询 更复杂的模式进行查询:
POST /bookdb_index/book/_search
{
"query": {
"regexp" : {
"authors" : "t[a-z]*y"
}
},
"_source": ["title", "authors"],
"highlight": {
"fields" : {
"authors" : {}
}
}
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 1,
"_source": {
"title": "Solr in Action",
"authors": [
"trey grainger",
"timothy potter"
]
},
"highlight": {
"authors": [
"<em>trey</em> grainger",
"<em>timothy</em> potter"
]
}
}
]
8. 短语匹配(Match Phrase)查询
短语匹配查询 要求在请求字符串中的所有查询项必须都在文档中存在,文中顺序也得和请求字符串一致,且彼此相连。默认情况下,查询项之间必须紧密相连,但可以设置 slop
值来指定查询项之间可以分隔多远的距离,结果仍将被当作一次成功的匹配。
POST /bookdb_index/book/_search
{
"query": {
"multi_match" : {
"query": "search engine",
"fields": ["title", "summary"],
"type": "phrase",
"slop": 3
}
},
"_source": [ "title", "summary", "publish_date" ]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.22327082,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.16113183,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
}
]
注:在上述例子中,对于非整句类型的查询,_id
为 1 的文档一般会比 _id
为 4 的文档得分高,结果位置也更靠前,因为它的字段长度较短,但是对于 短语匹配类型 查询,由于查询项之间的接近程度是一个计算因素,因此 _id
为 4 的文档得分更高。
9. 短语前缀(Match Phrase Prefix)查询
短语前缀式查询 能够进行 即时搜索(search-as-you-type) 类型的匹配,或者说提供一个查询时的初级自动补全功能,无需以任何方式准备你的数据。和 match_phrase
查询类似,它接收slop
参数(用来调整单词顺序和不太严格的相对位置)和 max_expansions
参数(用来限制查询项的数量,降低对资源需求的强度)。
POST /bookdb_index/book/_search
{
"query": {
"match_phrase_prefix" : {
"summary": {
"query": "search en",
"slop": 3,
"max_expansions": 10
}
}
},
"_source": [ "title", "summary", "publish_date" ]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.5161346,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.37248808,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
}
]
注:采用 查询时即时搜索 具有较大的性能成本。更好的解决方案是采用 索引时即时搜索。更多信息,请查看 自动补齐接口(Completion Suggester API) 或 边缘分词器(Edge-Ngram filters)的用法。
10. 查询字符串(Query String)
查询字符串 类型(query_string)的查询提供了一个方法,用简洁的简写语法来执行 多匹配查询、 布尔查询 、 提权查询、 模糊查询、 通配符查询、 正则查询 和范围查询。下面的例子中,我们在那些作者是 “grant ingersoll” 或 “tom morton” 的某本书当中,使用查询项 “search algorithm” 进行一次模糊查询,搜索全部字段,但给 summary
的权重提升 2 倍。
POST /bookdb_index/book/_search
{
"query": {
"query_string" : {
"query": "(saerch~1 algorithm~1) AND (grant ingersoll) OR (tom morton)",
"fields": ["_all", "summary^2"]
}
},
"_source": [ "title", "summary", "authors" ],
"highlight": {
"fields" : {
"summary" : {}
}
}
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 0.14558059,
"_source": {
"summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"authors": [
"grant ingersoll",
"thomas morton",
"drew farris"
]
},
"highlight": {
"summary": [
"organize text using approaches such as full-text <em>search</em>, proper name recognition, clustering, tagging, information extraction, and summarization"
]
}
}
]
11. 简单查询字符串(Simple Query String)
简单请求字符串 类型(simple_query_string)的查询是请求字符串类型(query_string)查询的一个版本,它更适合那种仅暴露给用户一个简单搜索框的场景;因为它用 +/\|/-
分别替换了 AND/OR/NOT
,并且自动丢弃了请求中无效的部分,不会在用户出错时,抛出异常。
POST /bookdb_index/book/_search
{
"query": {
"simple_query_string" : {
"query": "(saerch~1 algorithm~1) + (grant ingersoll) | (tom morton)",
"fields": ["_all", "summary^2"]
}
},
"_source": [ "title", "summary", "authors" ],
"highlight": {
"fields" : {
"summary" : {}
}
}
}
12. 词条(Term)/多词条(Terms)查询
以上例子均为 full-text
(全文检索) 的示例。有时我们对结构化查询更感兴趣,希望得到更准确的匹配并返回结果,词条查询 和 多词条查询 可帮我们实现。在下面的例子中,我们要在索引中找到所有由 Manning 出版的图书。
POST /bookdb_index/book/_search
{
"query": {
"term" : {
"publisher": "manning"
}
},
"_source" : ["title","publish_date","publisher"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 1.2231436,
"_source": {
"publisher": "manning",
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"publish_date": "2013-01-24"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 1.2231436,
"_source": {
"publisher": "manning",
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 1.2231436,
"_source": {
"publisher": "manning",
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
}
]
可使用词条关键字来指定多个词条,将搜索项用数组传入。
{
"query": {
"terms" : {
"publisher": ["oreilly", "packt"]
}
}
}
- 下节再续 -
ElasticSearch+ELK日志平台全套视频教程等相关学习资源可以在公众号后台回复【1】加小助手索取。
文章转载自N3xt-Tech的博客,写的很好,侵删。可点击文末阅读原文查看。
本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。
推荐阅读:
不限速 | 百度网盘命令行工具
Kubernetes,走进未来软件世界的敲门砖
极致简洁的markdown编辑神器
历史文章:
mysql数据导出golang实现
爬虫遇到了点问题
你有必要知道的三个问题
ElasticSearch学习笔记之原理介绍
本文由“壹伴编辑器”提供技术支持
我是小碗汤,我们一起学习。
扫码关注,精彩内容第一时间推给你
本文分享自微信公众号 - 我的小碗汤(mysmallsoup)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
19 个很有用的 ElasticSearch 查询语句 篇二
点击蓝字关注
由于篇幅原因,分为两小节推送,此文续上一篇文章:
19 个很有用的 ElasticSearch 查询语句 篇一
13. 词条(Term)查询 - 排序(Sorted)
词条查询 的结果(和其他查询结果一样)可以被轻易排序,多级排序也被允许:
POST /bookdb_index/book/_search
{
"query": {
"term" : {
"publisher": "manning"
}
},
"_source" : ["title","publish_date","publisher"],
"sort": [
{ "publish_date": {"order":"desc"}},
{ "title": { "order": "desc" }}
]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": null,
"_source": {
"publisher": "manning",
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
},
"sort": [
1449100800000,
"in"
]
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": null,
"_source": {
"publisher": "manning",
"title": "Solr in Action",
"publish_date": "2014-04-05"
},
"sort": [
1396656000000,
"solr"
]
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": null,
"_source": {
"publisher": "manning",
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"publish_date": "2013-01-24"
},
"sort": [
1358985600000,
"to"
]
}
]
14. 范围查询
另一个结构化查询的例子是 范围查询。在这个例子中,我们要查找 2015 年出版的书。
POST /bookdb_index/book/_search
{
"query": {
"range" : {
"publish_date": {
"gte": "2015-01-01",
"lte": "2015-12-31"
}
}
},
"_source" : ["title","publish_date","publisher"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 1,
"_source": {
"publisher": "oreilly",
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 1,
"_source": {
"publisher": "manning",
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
}
]
注:范围查询 用于日期、数字和字符串类型的字段。
15. 过滤 (Filtered) 查询
过滤查询允许你可以过滤查询结果。对于我们的例子中,要在标题或摘要中检索一些书,查询项为 Elasticsearch,但我们又想筛出那些仅有 20 个以上评论的。
POST /bookdb_index/book/_search
{
"query": {
"filtered": {
"query" : {
"multi_match": {
"query": "elasticsearch",
"fields": ["title","summary"]
}
},
"filter": {
"range" : {
"num_reviews": {
"gte": 20
}
}
}
}
},
"_source" : ["title","summary","publisher", "num_reviews"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.5955761,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"publisher": "oreilly",
"num_reviews": 20,
"title": "Elasticsearch: The Definitive Guide"
}
}
]
注:过滤查询 并不强制它作用于其上的查询必须存在。如果未指定查询,match_all
基本上会返回索引内的全部文档。实际上,过滤只在第一次运行,以减少所需的查询面积,并且,在第一次使用后过滤会被缓存,大大提高了性能。
更新:过滤查询 将在 ElasticSearch 5
中移除,使用 布尔查询 替代。 下面有个例子使用 布尔查询 重写上面的例子:
POST /bookdb_index/book/_search
{
"query": {
"bool": {
"must" : {
"multi_match": {
"query": "elasticsearch",
"fields": ["title","summary"]
}
},
"filter": {
"range" : {
"num_reviews": {
"gte": 20
}
}
}
}
},
"_source" : ["title","summary","publisher", "num_reviews"]
}
在后续的例子中,我们将会把它使用在 多重过滤 中。
16. 多重过滤(Multiple Filters)
多重过滤 可以结合 布尔查询 使用,下一个例子中,过滤查询决定只返回那些包含至少 20 条评论,且必须在 2015 年前出版,且由 O’Reilly 出版的结果。
POST /bookdb_index/book/_search
{
"query": {
"filtered": {
"query" : {
"multi_match": {
"query": "elasticsearch",
"fields": ["title","summary"]
}
},
"filter": {
"bool": {
"must": {
"range" : { "num_reviews": { "gte": 20 } }
},
"must_not": {
"range" : { "publish_date": { "lte": "2014-12-31" } }
},
"should": {
"term": { "publisher": "oreilly" }
}
}
}
}
},
"_source" : ["title","summary","publisher", "num_reviews", "publish_date"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.5955761,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"publisher": "oreilly",
"num_reviews": 20,
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
}
]
17. 作用分值:域值(Field Value)因子
也许在某种情况下,你想把文档中的某个特定域作为计算相关性分值的一个因素,比较典型的场景是你想根据普及程度来提高一个文档的相关性。在我们的示例中,我们想把最受欢迎的书(基于评论数判断)的权重进行提高,可使用 field_value_factor
用以影响分值。
POST /bookdb_index/book/_search
{
"query": {
"function_score": {
"query": {
"multi_match" : {
"query" : "search engine",
"fields": ["title", "summary"]
}
},
"field_value_factor": {
"field" : "num_reviews",
"modifier": "log1p",
"factor" : 2
}
}
},
"_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.44831306,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"num_reviews": 20,
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.3718407,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"num_reviews": 23,
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.046479136,
"_source": {
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"num_reviews": 18,
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 0.041432835,
"_source": {
"summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
"num_reviews": 12,
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"publish_date": "2013-01-24"
}
}
]
注 1: 我们可能刚运行了一个常规的 multi_match
(多匹配) 查询,并对 num_reviews
域进行了排序,这让我们失去了评估相关性分值的好处。
注 2: 有大量的附加参数可用来调整提升原始相关性分值效果的程度,比如 modifier
, factor
, boost_mode
等等,至于细节可在 Elasticsearch 指南中探索。
18. 作用分值:衰变(Decay)函数
假设不想使用域值做递增提升,而你有一个理想目标值,并希望用这个加权因子来对这个离你较远的目标值进行衰减。有个典型的用途是基于经纬度、价格或日期等数值域的提升。在如下的例子中,我们查找在 2014 年 6 月左右出版的,查询项是 search engines 的书。
POST /bookdb_index/book/_search
{
"query": {
"function_score": {
"query": {
"multi_match" : {
"query" : "search engine",
"fields": ["title", "summary"]
}
},
"functions": [
{
"exp": {
"publish_date" : {
"origin": "2014-06-15",
"offset": "7d",
"scale" : "30d"
}
}
}
],
"boost_mode" : "replace"
}
},
"_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.27420625,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"num_reviews": 23,
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.005920768,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"num_reviews": 20,
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 0.000011564,
"_source": {
"summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
"num_reviews": 12,
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"publish_date": "2013-01-24"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.0000059171475,
"_source": {
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"num_reviews": 18,
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
}
]
19. 函数分值:脚本评分
当内置的评分函数无法满足你的需求时,还可以用 Groovy 脚本。在我们的例子中,想要指定一个脚本,能在决定把 num_reviews
的因子计算多少之前,先将 publish_date
考虑在内。因为很新的书也许不会有评论,分值不应该被惩罚。
评分脚本如下:
publish_date = doc[''publish_date''].value
num_reviews = doc[''num_reviews''].value
if (publish_date > Date.parse(''yyyy-MM-dd'', threshold).getTime()) {
my_score = Math.log(2.5 + num_reviews)
} else {
my_score = Math.log(1 + num_reviews)
}
return my_score
在 script_score
参数内动态调用评分脚本:
POST /bookdb_index/book/_search
{
"query": {
"function_score": {
"query": {
"multi_match" : {
"query" : "search engine",
"fields": ["title", "summary"]
}
},
"functions": [
{
"script_score": {
"params" : {
"threshold": "2015-07-30"
},
"script": "publish_date = doc[''publish_date''].value; num_reviews = doc[''num_reviews''].value; if (publish_date > Date.parse(''yyyy-MM-dd'', threshold).getTime()) { return log(2.5 + num_reviews) }; return log(1 + num_reviews);"
}
}
]
}
},
"_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": {
"total": 4,
"max_score": 0.8463001,
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "1",
"_score": 0.8463001,
"_source": {
"summary": "A distibuted real-time search and analytics engine",
"num_reviews": 20,
"title": "Elasticsearch: The Definitive Guide",
"publish_date": "2015-02-07"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "4",
"_score": 0.7067348,
"_source": {
"summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
"num_reviews": 23,
"title": "Solr in Action",
"publish_date": "2014-04-05"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "3",
"_score": 0.08952084,
"_source": {
"summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
"num_reviews": 18,
"title": "Elasticsearch in Action",
"publish_date": "2015-12-03"
}
},
{
"_index": "bookdb_index",
"_type": "book",
"_id": "2",
"_score": 0.07602123,
"_source": {
"summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
"num_reviews": 12,
"title": "Taming Text: How to Find, Organize, and Manipulate It",
"publish_date": "2013-01-24"
}
}
]
}
注 1: 要在 Elasticsearch 实例中使用动态脚本,必须在 config/elasticsearch.yaml 文件中启用它;也可以使用存储在 Elasticsearch 服务器上的脚本。建议看看 Elasticsearch 指南文档获取更多信息。
注 2: 因 JSON 不能包含嵌入式换行符,请使用分号来分割语句。
引用自:23 USEFUL ELASTICSEARCH EXAMPLE QUERIES
https://distributedbytes.timojo.com/2016/07/23-useful-elasticsearch-example-queries.html
- END -
ElasticSearch+ELK 日志平台全套视频教程等相关学习资源可以在公众号后台回复【1】加小助手索取。
文章转载自 N3xt-Tech 的博客,写的很好,侵删。
本公众号免费提供 csdn 下载服务,海量 IT 学习资源,如果你准备入 IT 坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于 java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程 IT 相关资源。
推荐阅读:
不限速 | 百度网盘命令行工具
19 个很有用的 ElasticSearch 查询语句 篇一
极致简洁的 markdown 编辑神器
历史文章:
mysql 数据导出 golang 实现
爬虫遇到了点问题
Go 语言 IDE GoLand 的 BUG
ElasticSearch 学习笔记之原理介绍
本文由 “壹伴编辑器” 提供技术支持
我是小碗汤,我们一起学习。
扫码关注,精彩内容第一时间推给你