Elasticsearch结构化搜索与查询
Elasticsearch 的功能之一就是搜索,搜索主要分为两种类型,结构化搜索和全文搜索。结构化搜索是指有关查询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。
导入学习数据:
curl -XPOST 'http://hadoop01:9200/school/student/_bulk' -d '
{ "index": { "_id": 1 }}
{ "name" : "liubei", "age" : 20 , "sex": "boy", "birth": "1996-01-02" , "about": "i like diaocan he girl" }
{ "index": { "_id": 2 }}
{ "name" : "guanyu", "age" : 21 , "sex": "boy", "birth": "1995-01-02" , "about": "i like diaocan" }
{ "index": { "_id": 3 }}
{ "name" : "zhangfei", "age" : 18 , "sex": "boy", "birth": "1998-01-02" , "about": "i like trivel" }
{ "index": { "_id": 4 }}
{ "name" : "diaocan", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like trivel and sport" }
{ "index": { "_id": 5 }}
{ "name" : "panjinlian", "age" : 25 , "sex": "girl", "birth": "1991-01-02" , "about": "i like trivel and wusong" }
{ "index": { "_id": 6 }}
{ "name" : "caocao", "age" : 30 , "sex": "boy", "birth": "1988-01-02" , "about": "i like xiaoqiao" }
{ "index": { "_id": 7 }}
{ "name" : "zhaoyun", "age" : 31 , "sex": "boy", "birth": "1997-01-02" , "about": "i like trivel and music" }
{ "index": { "_id": 8 }}
{ "name" : "xiaoqiao", "age" : 18 , "sex": "girl", "birth": "1998-01-02" , "about": "i like caocao" }
{ "index": { "_id": 9 }}
{ "name" : "daqiao", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like trivel and history" }
'
1: 使用match_all做查询
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"match_all": {}
}
}'
问题:通过match_all匹配后,会把所有的数据检索出来,但是往往真正的业务需求并非要找全部的数据,而是检索出自己想要的;
并且对于es集群来说,直接检索全部的数据,很容易造成GC现象
所以,我们要学会如何进行高效的检索数据
2:通过关键字段进行查询
查询喜欢旅游的人:
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"match": {"about": "trivel"}
}
}'
如果此时想查询喜欢旅游的,并且不能是男孩的,怎么办?
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"match": {
"about": "trivel",
"sex": "girl"
}
}
}'
【这种方式是错误的,因为一个match下,不能出现多个字段值[match] query doesn't support multiple fields】,需要使用复合查询
3:bool的复合查询
当出现多个查询语句组合的时候,可以用bool来包含。bool包含:must,must_not或者should, should表示or的意思
例子:查询非男性中喜欢旅行的人
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "match": {"about": "trivel"}},
"must_not": {"match": {"sex": "boy"}}
}
}
}'
bool的复合查询中的should语句:
should表示可有可无的(如果should匹配到了就展示,否则就不展示)
例子:查询喜欢旅行的,如果有男性的则显示,否则不显示
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "match": {"about": "trivel"}},
"should": {"match": {"sex": "boy"}}
}
}
}'
4: term匹配
使用term进行精确匹配(比如数字,日期,布尔值或 not_analyzed的字符串(未经分析的文本数据类型))
语法
{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "trivel" }}
例子:查询喜欢旅行的
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "term": {"about": "trivel"}},
"should": {"term": {"sex": "boy"}}
}}
}'
5:使用terms匹配多个值
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "terms": {"about": ["trivel","history"]}}
}
}
}'
term主要是用于精确的过滤比如说:”我爱你”
在match下面匹配可以为包含:我、爱、你、我爱等等的解析器
在term语法下面就精准匹配到:”我爱你”
例子:使用match方式,会匹配包含:and、history、and history
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "match": {"about": "and history"}}
}
}
}'
如果使用term进行精确匹配,那么会精确匹配and history:
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "term": {"about": "and history"}}
}
}
}'
返回结果:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
如果直接查询history
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "term": {"about": "history"}}
}
}
}'
会返回结果,这就说明使用term查询,会精确匹配,如果没有这个词项,就匹配不到
6:Range过滤
Range过滤允许我们按照指定的范围查找一些数据:操作范围:gt::大于,gae::大于等于,lt::小于,lte::小于等于
例子:查找出大于20岁,小于等于25岁的学生
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"range": {
"age": {"gt":20,"lte":25}
}
}
}
}'
7:exists和 missing过滤
通过exists和missing过滤可以找到文档中是否包含某个字段或者是没有某个字段
例子:查找字段中包含age的文档
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"exists": {
"field": "age"
}
}
}
}'
8:bool的多条件过滤
用bool也可以像之前match一样来过滤多行条件:
must :: 多个查询条件的完全匹配,相当于 and 。
must_not :: 多个查询条件的相反匹配,相当于 not 。
should :: 至少有一个查询条件匹配, 相当于 or
例子:过滤出about字段包含trivel并且年龄大于20岁小于30岁的同学
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": { "term": {"about": "trivel"}},
"must": {"range": {"age": {"gt": 20,"lt":30}}}
}
}
}'
9:查询与过滤条件合并
通常复杂的查询语句,我们也要配合过滤语句来实现缓存,用filter语句就可以来实现
例子:查询出喜欢旅行的,并且年龄是20岁的文档
curl -XGET 'hadoop01:9200/school/student/_search?pretty' -d '
{
"query": {
"bool": {
"must": {"match": {"about": "trivel"}},
"filter": [{"term":{"age": 20}}]
}
}
}'
Elasticsearch结构化搜索与查询的更多相关文章
- Elasticsearch 结构化搜索、keyword、Term查询
前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...
- ElasticSearch 结构化搜索
1.介绍 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作. 比较常见的操作 ...
- ElasticSearch 结构化搜索全文
1.介绍 上篇介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档. 全文搜索两个最重要的方面是: 相关性(Relevan ...
- Elasticsearch结构化搜索_在案例中实战使用term filter来搜索数据
1.根据用户ID.是否隐藏.帖子ID.发帖日期来搜索帖子 (1)插入一些测试帖子数据 POST /forum/article/_bulk { "index": { "_i ...
- ElasticSearch 2 (13) - 深入搜索系列之结构化搜索
ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...
- ElasticSearch常用结构化搜索
最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数 ...
- ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分
一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...
- elasticsearch 深入 —— 结构化搜索
结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作 ...
- Elasticsearch系列---结构化搜索
概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...
随机推荐
- ssh-config的使用
使用SSH的配置文件可以在很大程度上方便各种操作,特别适应于有多个SSH帐号.使用非标准端口或者写脚本等情况. man ssh_config 可以查看手册 如果之前是用密码方式来登录SSH,需要先改用 ...
- [转帖]安全公告【安全公告】CVE-2019-0708远程桌面服务远程代码执行漏洞
[安全公告]CVE-2019-0708远程桌面服务远程代码执行漏洞 https://www.landui.com/help/nshow-9716.html 漏洞层出不穷 漏洞信息: 2019年5月14 ...
- jmeter应用之批量插入数据
上一篇讲到如何在jmeter中配置并连接使用mysql数据库,这一节主要是讲数据库连接的简单应用——批量插入数据 总体步骤如下: 1)新建线程组和添加JDBC Connection Configura ...
- Java编程思想学习录(连载之:内部类)
内部类基本概念 可将一个类的定义置于另一个类定义的内部 内部类允许将逻辑相关的类组织在一起,并控制位于内部的类的可见性 甚至可将内部类定义于一个方法或者任意作用域内! 当然,内部类 ≠ 组合 内部类拥 ...
- ES6 系列之异步处理实战
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...
- Javascript高级面试
原型 异步 一.什么是单线程,和异步有什么关系 单线程:只有一个线程,同一时间只能做一件事原因:避免DOM渲染的冲突解决方案:异步 为什么js只有一个线程:避免DOM渲染冲突 浏览器需要渲染DOM J ...
- GridView做加
原文:http://www.cnblogs.com/insus/archive/2012/09/22/2697862.html 下面是Insus.NET实现演示: CObj.cs代码: using S ...
- ECMAScrip5 二
一.ES5的严格模式 在严格模式下,声明变量必须使用 var 在严格模式下,不能使用八进制 在严格模式下,不能使用arguments.callee 在严格模式下,不能使用eval() //eva ...
- redHat 安装mono 错误
make[6]: * [do-install] Error 2 make[6]: Leaving directory /root/lindexi/mono-2.11.3/mcs/class/Syste ...
- 为docker配置国内镜像加速器
docker官方镜像仓库地址为:https://hub.docker.com/search?q=&type=image 因为是国外地址,因此下载镜像时速度很慢. 我们需要配置国内镜像加速, 可 ...