A. 如何用Elasticsearch实现类似sql中的IN查询实例
在es1.x版本写法如下:
{
"query" : {
"filtered" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
在es2.x或以上版本写法如下:
{
"query" : {
"bool" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
B. ES查询语法
参数拼接到查询路劲中查询,查询可以不指定 type 的类型
查询结果部分字段说明:
value值部分会作为整体被查询, 不会被分词, 与match做区分, match的value是会被分词作匹配查询的.
返回的文档必须满足must子句的条件,并且参与计算分值
返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值
返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句, 默认情况是1
返回的文档必须不满足must_not定义的条件。
如果一个查询既有filter又有should,那么至少包含一个should子句。
bool查询也支持禁用协同计分选项disable_coord。一般计算分值的因素取决于所有的查询条件。
bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
使用 _source 可以只查询需要展示的列, 相当于 sql 的 select offset,methodName from ...
from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10,
如
聚合查询的结构:
举例说明:
比如求所有文档某个字段求最大、最小、和、平均值, 可以对某个field进行计算.
以avg为例, 计算offset在所有文档中的均值
运行结果:
该聚合一般域其它 single-value 聚合联合使用,比如在计算一个字段的平均值的时候,可能还会关注这个平均值是由多少个值计算而来。
例子:统计搜索结果中maiDianType字段出现的次数
搜索结果:
基于文档的某个值(可以是特定的字段,也可以通过脚本计算而来),计算文档非重复的个数(去重计数),相当于sql中的distinct。
例子: 统计搜索结果中maiDianType出现的种类
搜索结果: maiDianType共有6种值
基于文档的某个值(可以是特定的数值型字段,也可以通过脚本计算而来),计算出一些统计信息(min、max、sum、count、avg5个值)。
例子: 基于useTime进行值统计
ps: 这个例子中是基于脚本进行的统计
统计结果:
与stats功能相似, 比stats多4个统计结果: 平方和、方差、标准差、平均值加/减两个标准差的区间
例子:
结果:
对指定字段(脚本)的值按从小到大累计每个值对应的文档数的占比(占所有命中文档数的百分比),返回指定占比比例对应的值。默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值,也可以指定分位置.
例子:
结果:
ps:
"1.0":30 代表: useTime<30的, 占比1%
"99.0":237 代表: useTime<237的, 占比99%
例子: 指定聚合的百分比
查询结果:
词聚合。基于某个field,该 field 内的每一个【唯一词元】为一个桶,每个桶内可以做再次聚合.
列子: 以prodSubNo的每个值作为聚合, 聚合结果默认排序为从大到小
搜索结果:
doc_count_error_upper_bound: //文档计数的最大偏差值
sum_other_doc_count: , //未返回的其他项的文档数
列子: 以prodSubNo的每个值作为聚合, 得到的桶继续做avg子聚合, 得到每个prodSubNo下的useTime的avg聚合结果
搜索结果:
基于一个条件,来对当前的文档进行过滤的聚合。
例子: 对查询结果进行过滤, prodSubNo=601001聚合过滤, 可对过滤后的内容进行子聚合查询, 这里使用stats统计聚合
查询结果:
基于多个过滤条件,来对当前文档进行【过滤】的聚合,每个过滤都包含所有满足它的文档(多个bucket中可能重复),先过滤再聚合。
例子: 使用prodSubNo=601001和maiDianType=script分别对索引结果进行过滤
搜索结果:
范围分组聚合。基于某个值(可以是 field 或 script),以【字段范围】来桶分聚合。范围聚合包括 from 值,不包括 to 值(区间前闭后开)。
例子: 对于useTime字段值进行0-20和20-40范围内的聚合
ps: 对范围聚合后的结果,还可以进行子聚合
搜索结果:
C. SQL语句查询条件一个字段=多个值怎么写
假定表名test,列id是数值类型。用同一个字段的多 个值作为条件来查询可以使用in或者or。
具体语句如下:
1、select * from test where id in (1,2,3)
go
2、select * from testwhere id= 1orid =2orid=3
go
布局化查询言语(Structured Query Language)简称SQL(发音:/es kju el/ S-Q-L),是一类特殊目标的编程言语,是一类数据库查询和法式设想言语,用于存取数据以及查询、更新和办理关系数据库系统;同时也是数据库脚本文件的扩展名。
(3)es开源sql查询扩展阅读
SQL命令的类型
1、数据定义语言(DDL)
用于创建和重构数据库对象,比如创建(create table/Index/view)、修改(alter table/index/view)和删除(drop table/index/view)表。
2、数据操作语言(DML)
用于操作关系型数据库对象内部的数据,基本命令插入(Insert)、更新(Update)和删除(Delete)。
3、数据查询语句(DQL)
是现代关系型数据库用户最关注的部分,就一个命令查询(Select)。
4、数据控制语言(DCL)
用于控制对数据库里数据的访问,通常用于创建与用户访问相关的对象,以及控制用户的权限,如修改密码(Alter password)、权限(Grant)。
D. elasticsearch基本查询笔记(三)-- es查询总结
term 查询是简单查询,接受一个字段名和参数,进行精准查询,类似sql中:
ES中对应的DSL如下:
在ES5.x及以上版本,字符串类型需设置为keyword或text类型,根据类型来进行精确值匹配。
当进行精确值查询,可以使用过滤器,因为过滤器的执行非常快,不会计算相关度(ES会计算查询评分),且过滤器查询结果容易被缓存。
bool过滤器组成部分:
当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。
terms是包含的意思,如下:
name包含["奥尼尔","麦迪"]
返回结果:
range查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:
类似sql中的范围查询:
ES中对应的DSL如下:
如下sql,age不为null:
ES中对应的DSL如下:
如下sql,age为null:
ES中对应的DSL如下:
注:missing查询在5.x版本已经不存在。
匹配包含 not analyzed(未分词分析)的前缀字符:
匹配具有匹配通配符表达式( (not analyzed )的字段的文档。 支持的通配符:
1) * 它匹配任何字符序列(包括空字符序列);
2) ? 它匹配任何单个字符。
请注意,此查询可能很慢,因为它需要遍历多个术语。
为了防止非常慢的通配符查询,通配符不能以任何一个通配符*****或 ? 开头。
正则表达式查询允许您使用正则表达式术语查询。
举例如下:
注意: * 的匹配会非常慢,你需要使用一个长的前缀,
通常类似.*?+通配符查询的正则检索性能会非常低。
模糊查询查找在模糊度中指定的最大编辑距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键词。
举例:
检索索引test_index中,type为user的全部信息。不过在 es6.x 版本,一个index仅有一个type,未来 es7.x 版本,将取消type,所以这个查询没啥意义。
返回指定id的全部信息。
全文检索查询,是通过分析器,对查询条件进行分析,然后在全文本字段进行全文查询。
全文搜索取决于mapping中设定的analyzer(分析器),这里使用的是ik分词器。
所以在进行查询开发时候,需要先了解index的mapping,从而选择查询方式。
匹配查询接受文本/数字/日期类型,分析它们,并构造查询。
对查询传入参数进行分词,搜索词语相同文档。
match_phrase查询分析文本,并从分析文本中创建短语查询。
用户已经渐渐习惯在输完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search) 或输入即搜索(search-as-you-type) 。
不仅用户能在更短的时间内得到搜索结果,我们也能引导用户搜索索引中真实存在的结果。
例如,如果用户输入 johnnie walker bl ,我们希望在它们完成输入搜索条件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。
match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。
E. java SQL查询elasticsearch
可以添加筛选条件,将 columnName is not null 加在where后
F. 和SQL数据库里的查询/全文检索有什么区别
这个问题很难回答,es也可以理解成是一种数据库,不仅能提供全文检索功能,还可以支持各种数值类的区间查询,聚合计算等,这些和传统数据库一样,从使用场景来说,数据库一般用来存meta,比如网站用户,用户资源等等,这些数据有个特点就是量不会很大,还有就是这些数据一般都比较结构化。
es一般用来存一些流式数据,比如应用日志,这也是目前es应用最广的方面,这些数据有个特点就是往往结构不固定,比如应用日志,不同的程序员写得模块打出来的日志字段数量都不一样,这种数据就不太方便用数据库来处理。
最后,一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。
上面从使用场景上说明了两者的区别,从技术上两者全文检索的实现都差不多,无非是倒排索引,但是lucene毕竟是专业的,做了十几年了,索引效率,存储空间等都比传统数据库快很多,技术也迭代的非常快。
以上就是我总结的不同之处,希望能解答楼主的疑惑。
作者:Razzit
链接:https://www.hu.com/question/53063256/answer/151074607
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
G. sql语句,查询数据库里除了某一条记录外的所有记录。
1、打开sql server 可视化工具。
H. ES导致SQL注入的方式
SQL注入方法
方法1
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以这样
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正确的,那么写的表名或列名就是正确
这里要注意的是,exists这个不能应用于猜内容上,例如and exists (select len(user) from admin)>3 这样是不行的
很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容
获得数据库连接用户名:;and user>0
方法2
后台身份验证绕过漏洞
验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误
例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那么我使用'or 'a'='a来做用户名密码的话,那么查询就变成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'
这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了
这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。
第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了
I. android中,如何用sql语句查询某一条特定的记录
select * from tableName where id = '1';唯一特定的字段来确定一条记录。
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes
kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,
可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
J. sql语句查询,并统计查询结果数量
统计人数的话是不能看出成绩大于90的学生的信息的
如果你要看成绩大于90的学生的信息,就不能统计人数
select id,name,age,count(score)
from sd_student_t
where score > 90
group by id,name,age
这个也是统计并且查看详细信息,但是跟你要求的不一样,这个是按id,name,age来分组的,所以统计的知识同id,name,age里面成绩大于90的人数