ES基本查询,filter 查询,组合查询
Elasticsearch 是功能强大的全文搜索引擎,用它的目的就是为了能快速的查询你想好要的数据
基本查询:利用Elasticsearch内置查询条件进行查询
组合查询:把多个基本查询组合在一起的复合性查询
过滤:查询的同时,通过filter条件 在不影响打分的情况下筛选出想要的数据
基本查询:
1.term,terms查询
2.from,size
3.返回版本号_version
4.match查询
5.升序降序
6.prefix前缀匹配查询
7.range 范围查询
8.wildcard 通配符查询
9.fuzzy 模糊查询
10.more_like & more_like_this_field查询
查询某一个索引的映射信息:
eg:index:library
查询方式:
GET /library/_mapping ##会显示每个字段的类型信息
最简单的查询:
#指定index名以及type名的搜索,title 里面包含elasticsearch 关键字的文档,
GET /library/books/_search?q=title.elasticsearch
library 是索引字段值,books是type 字段值
##都不指定的搜索
GET /_search?q=title:elasticsearch
_score 是ES给搜索打的分值,分值越高越靠前,max_score是最高分。
“_shards”:{“total”:5,"successful":5,"failed":0},
total 是5个分片,successful 是从5个分片里面抽取结果组成,failed:0 是没有失败
“timed_out”false; 没有超时
1.term 查询
#term查询:查询 preview 字段里有某个关键词的文档
GET /library/books/_search
{"query":{"term":"“preview”:"elasticsearch"}}
}
terms 查询:查询某个字段里有多个关键词的文档
miniumum_match:最小匹配集:
设置为1.说明两个关键词里面最少有一个
设置为2. 说明文档里这2个关键词都得存在
GET /library/books/_search
{"query"{"terms"{"preview":["elasticsearch","book"]“miniumu_match”:2}}
}
2.from,size
控制查询返回的数量
#相当于mysql 里面的limit
from:从哪个结果开始返回
size:定义返回最大的结果数
GET /library/books/_search
{“from”:1, ##从第二个开始"size":2, ##返回2个"query":{"term":"“preview”:"elasticsearch"}}
}
3.返回版本号_version
GET /library/books/_search
{“version”:true, #设置为true 显示版本"query":{"term":"“preview”:"elasticsearch"}}
}
4.match查询
match 查询可以接受文字,数字日期等数据类型
match 和term的区别是,match 查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询时不会有分析器分析的过程
GET /library/books/_search
{"query"{"match"{"preview":"elasticsearch" ##字符串类型}}
}
GET /library/books/_search
{"query"{"match"{"price":11 #数字类型}}
}
通过match_all查询
查询指定索引下的所有文档
GET /library/books/_search
{"query"{"match_all"{"price":11 #数字类型}}
}
通过match_phrase查询
短语查询,slop定义的关键词之间隔多个未知的单词
查询elasticsearch,distributed 之间间隔2个单词的文档
GET /library/books/_search
{"query"{"match_phrase":{"preview":{"query":"Elasticsearch,distributed","slop":2}}
}
multi_match查询
可以指定多个字段
比如 查询title 和preview 这2个字段里都包含Elasticsearch 关键词的文档
GET /library/books/_search
{"query"{"multi_match":{"query":"Elasticsearch","fields":["title","preview"]}
}
指定返回的字段
GET /library/books/_search
{“fields”:["preview","title"] ##这里指定要返回的字段"query"{"match":{"preview":"elasticeearch"}}
}
通过partial_fields 控制加载的字段
GET /library/books/_search
{“partial_fields”:{"partial":{"include":["preview"],"exclude":["title","price"]}},"query":{"match_all":{}
}
}
还能加通配符
GET /library/books/_search
{“partial_fields”:{"partial":{"include":["pre*"],"exclude":["tit*"]}},"query":{"match_all":{}
}
}
5.升序降序
通过sort把结果排序
desc 降序
asc 升序
GET /library/books/_search
{"query":{"match_all":{}},"sort":[{"price":{ ##根据这个字段"order":"desc" ##asc 升序}}]
}
6.prefix前缀匹配查询
GET /library/books/_search
{"query":{"prefix":{"title":{"value":"r" ##匹配title 字段 r开头的}}
}
}
7.range 范围查询
有from ,to,include_lower,include_upper, boost 这些参数
include_lower: 是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true
GET /library/books/_search
{"query":{"range":{"publish_date":{ #时间字段"from":"2015-01-01","to":"2015-06-30"}}}
}
demo2:
GET /library/books/_search
{"query":{"range":{"price":{ #价格字段"from":"10","to":"20","include_lower":true, ##意思是包括10"include_upper":false ###不包括20}}}
}
8.wildcard 通配符查询
wildcard 查询:允许你使用通配符 * 和 ? 来进行查询
*代表一个或多个字符
? 仅代表一个字符
注意:这个查询功能影响性能
GET /library/books/_search
{“query”:{"wildcard":{"preview":"rab*"}}
}
GET /library/books/_search
{“query”:{"wildcard":{"preview":"luc?ne"}}
}
9.fuzzy 模糊查询
value :查询的关键字
boost: 设置查询的权值,默认是1.0
min_similarity :设置匹配的最小相似度
默认值为0.5:对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型,取值为1d,2d,1m这样,1d就代表1天
prefix_length:指明区分词项的共同匹配长度,默认是0
max_expansions:指明查询中的词项可扩展的数据,默认可以是无限大
##这个也是很耗资源
GET /library/books/_search
{"query":{"fuzzy":{"preview":"rabit" ##preview 是要查询的字段值}}
}
demo2
GET /library/books/_search
{"query":{"fuzzy":{"preview":{"value":"rabit" , ##preview 是要查询的字段值"min_similarity":0.5}}}
}
fuzzy_like_this 查询
查询得到与给定内容相似的所有文档
fileds:字段组,默认是_all
like_text: 设置关键词
ignore_tf : 设置忽略词项的频次,默认是false
max_query_terns : 指明在生成的查询中查询词项的最大数据,默认是25
min_similarity: 指明区分词项最小的相似度,默认是0.5
prefix_length: 指明区分词项共同前缀的长度,默认是0
boost:设置权值,默认是1.0
analyze:指明用于分析给定内容的分析器
GET /library/books/search
{"query":{"fuzzy_like_this":{"fileds":["preview"], ###可定义多个字段"like_text":"open source software","min_similarity":0.5,"prefix_length":0.2}}
}
fuzzy_like_this_field 查询
只作用在一个字段里
其它与fuzzy_like_this功能一样
GET /library/books/search
{"query":{"fuzzy_like_this_field":{"preview":{ #只能一个字段"like_text":"open source software","min_similarity":0.5,"prefix_length":0.2}}}
}
more_like_this 查询
fields: 定义字段组,默认是all
like_text :定义要查询的额关键词
percent_terms_to_match :该参数指明一个文档必须匹配多大比例的词项才被视为相似。默认值是0.3,意思是30%的比例
min_term_freq: 改参数指明在生成的查询中查询词项的最大数据。默认是25
stop_words:该参数指明将被忽略的单词集合
min_doc_freq:该参数指明词项应至少在多少个文档中出现才不会被忽略。more 是5
max_doc_freq: 该参数指明出现词项的最大数目,以避免词项被忽略。默认无限大
min_word_len: 该参数指明单个当个单词的最小长度,低于该值的单词将被忽略,默认是无限大。
max_word_len: 指明单个单词的最大长度,高于该值的单词将被忽略。默认是无限大
boost_terms:该参数指明提升每个单词的权重时使用的权值。默认是1
boost:指明提升一个查询的权值。默认是1.0
analyer:指明用于分析的分析器
GET /library/books/_search
{"query":{"more_like_this":{"fields":["preview"], ##指定字段"like_text":"apache open source","min_term_freq":1,"min_doc_freq":1}}
}
同上面的类似,也有一个 more_like_this_field 查询
只作用在一个字段里
其它和more_like_this功能一样
GET /library/books/_search
{"query":{"more_like_this_field":{"preview" :{"like_text":"apache open source","min_term_freq":1,"min_doc_freq":1}}}
}
**
filter 查询
**
1.filter 查询语句
2.cache 缓存
filter 类似于 SQL 里面的where 语句,和上面的基础查询比起来,也能实现搜索的功能,同时 filter 可以将查询缓存到内存当中,这样可以大大加大下一次的查询速度
推荐使用filter
最简单的filter查询
select document FROM products WHERE price = 20
filtered 查询价格是20的商品
GET /store/products/_search ###store 索引名 products 商品名
{"query":{"filtered":{"query":{"match_all":{} ##匹配所有}"filter":{"term":{ "price":20}}}}
}
也可以指定多个值
GET /store/products/_search ###store 索引名 products 商品名
{"query":{"filtered":{"query":{"match_all":{} ##匹配所有}"filter":{"term":{ "price":[10,20] 指定多个值###"productID":"sd24222222" 存在搜索不出来的情况,查看分析器解析的结果}}}}
}
#查看分析器解析的结果
GET /_analyze?text=SD24222222
查看分析的结果:
token 显示是小写,而我们搜索的是小写,那可能就查不到。
为什么会出现这种情况呢?是因为mapping 对字符串进行了分析,把大写的都变成了小写了。那如果就是想大写就能搜到呢?需要改map映射,重新建立一个映射,让productID处于not_analyzed模式
GET /store/_mapping ##查看映射
DELETE /store #删除映射,然后重新建立映射。
然后重新创建一下数据
PUT /store
{"mappings":{"products":{"properties":{"productID":{"type":"string","index":"not_analyzed"}}}}}
bool 过滤查询,可以做组合过滤查询
select product FROM products where (price = 20 OR productID = “SD1002136” AND (price !=30)
查询价格等于20的或者productID为SD453523的商品,排除价格30元的
类似的,Elasticsearch 也有 and,or ,not 这样的组合条件的查询方式
格式如下:
{"bool":{"must": [],"should":[],"must_not":[],}
}
must:条件必须满足,相当于 and
should 条件可以满足也可以不满足,相当于 or
must_not :条件不需要满足,相当于 not
GET /store/products/_search
{"query":{"fltered":{"filter" :{"bool":{"should":[{"term":{"price":20}},{"term":{"productID":"SD1002136"}}], ###或运算,满足其中一个"must_not":{"term":{"price":30}}}}}}
}
嵌套查询
SELECT document FROM products WHERE productID = “SD1002136” OR (productID = “sd4535233” AND price = 30)
GET /store/products/_search
{"query":{"fltered":{"filter" :{"bool":{"should":[ {"term":{"productID":"sd1002136"}},{"bool":{"must":["term":{"productID":"SD1002136"}},"term":{"price":30}}] }}}}
}
另外一种 and,or,not查询
就是说没有bool,直接使用and,or,not
查询价格即是10元,productID又为SD1002136的结果
GET /store/products/_search
{"query":{"filtered":{"filter":{"and":[{"term":{"price":10}},{"term":{"productID":"sd1002136"}}]},"query":{"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤}}}
}
查询价格即是10元或productID又为SD1002136的结果
GET /store/products/_search
{"query":{"filtered":{"filter":{"or":[{"term":{"price":10}},{"term":{"productID":"sd1002136"}}]},"query":{"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤}}}
}
not
查询productID不是SD1002136的商品
GET /store/products/_search
{"query":{"filtered":{"filter":{"not":[{"term":{"price":10}},]},"query":{"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤}}}
}
range 范围查询
SELECT document FROM products WHERE price BETWEEN 20 AND 40
ge : > 大于
lt: < 小于
gte: >= 大于等于
lte: <= 小于等于
GET /store/products/_search
{"query":{"filtered":{"filter" :{"range":{"price":{"gte":20,"lt":40}}}}}}
建立数据
过滤空和非空
处理null空值的方法
SELECT tags FROM test WHERE tags IS NOT NULL
SELECT tags FROM test WHERE tags IS NULL
GET /test_index/test/_search
{"query":{"filtered":{"filter":{"exists":{"field":"tags"} ##查询非空的情况}}}
}GET /test_index/test/_search
{"query":{"filtered":{"filter":{"missing":{"field":"tags"} ##查询都为空的}}}
}
cache 缓存
ES在执行带有filter查询时,会打开索引的每个segment文件(Lucene式底层文件),然后去判断里面的文档是否符合filter要求
注意:旧的segment文件不会变,新来的数据会产生新的segment
匹配的结果会用一个大型的BigSet数组来存储,这个数组的值只有0和1
匹配:1
不匹配:0
BigSet值是存在内存里的,而不是硬盘里,所以速度快
开启方式:在filter查询语句后面加上"_cache":true
注意:
Script filters,Geo-filters,Date ranges 这样的过滤方式开启cache无意义
exists,missing,range,term和terms查询是默认开启cache的
开启方式:
**
组合查询
**
1.bool查询
2.boosting 查询
3.constant_score查询
4.indices查询
bool 查询
1.bool查询
must,should,must_not
minimum_should_match: 表示一个文档至少匹配多少个短语才算是匹配成功
disable_coord: 弃用和禁用一个文档中所包含所有查询关键词的得分计算。默认是false
无Coordination 效果
含有apple的文档 -> 分值:1.5
含有apple jobs的文档 -> 分值:3.0
含有apple jobs mobile的文档 -> 分值:4.5
多一个词 分值多1.5
有Coordination 效果
含有apple的文档 -> 分值:1.5 *1/3 = 0.5
含有apple jobs的文档 -> 分值:3.0 * 2/3 = 2.0
含有apple jobs mobile的文档 -> 分值:4.5 * 3/3 = 4.5
2.boosting 查询
将2个查询封装在一起,然后可以降低一个查询结果返回的分值
positive 部分:查询返回的查询结果分值不变
negative 部分:查询的结果分值会被降低
negative_boost部分:设置 negative 中药降低的分值
优点:里面的2个查询都会有结果返回,其中一个分值就是你设置的分值
注意:如果是设有bool的must_not的话,那降低的那部分就没有结果返回
3.constant_score查询
优点:可以让一个查询得到一个恒定的分值
GET /library/books/_search
{"query""{"term":{"title":"elasticsearch"}}
}GET /library/books/_search
{"query":{"constant_score":{"query":{"term":{"title":"elasticsearch"}}}}
}
观察 _score的分值,第一个是变化的,第二个是恒定的值
4.indices查询
优点:可以在多个索引上进行查询
只有一个参数:no_match_query
查询其他索引里的数据
eg:
GET /_search
{"query":{"indices":{"indices":["library"],"query":{"term":{"title":"elasticsearch"}},"no_match_query":{"term":{"price":10}}}}}查询到的结果有别的索引里面的price 值为10 的,也有library 里面的匹配到的值。
ES基本查询,filter 查询,组合查询相关推荐
- 【ES】JavaAPI学习-07 组合查询 范围查询
前言 本节主要实现条件查询中的组合查询,范围查询 实现 编写组合查询 ESTest_Doc_Cond_Query_Com.java package com.zwy.es;import org.apac ...
- Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.表的创建 ...
- 连表查询使用in_SQL 组合查询
SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果返回. 使用UNION操作符,可以给出多条SELECT语句,将它们的结果组合成一个结果集. 1.使用UNION 给出每条SELE ...
- 数据库9:联结表 高级联结 组合查询 全文本搜索
第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分. ...
- 机房收费--组合查询
在学生基本信息维护这一窗体里,有一个组合查询,通过组合查询我们可以随意选择不同的条件,进而查询到自己想要查询的内容. 从上图我们不难看出,查询的条件是比较复杂一些,而且一个条件的设定就必须包含三个控件 ...
- 数据库系统实训——实验三——子查询与组合查询
一.子查询与组合查询 题号:1 SQL语句描述: /SELECT ORDER_NUM FROM ORDERITEMS where prod_id='tnt2';/ /select cust_id fr ...
- 企业级系统应用,高级组合查询示例讲解 - Jeecg实战
企业级系统应用,高级组合查询示例讲解 - Jeecg实战 ---数据多维度查询 经常会有人问:JEECG高级查询怎么用,实现机制是怎样的? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构 ...
- SQL必知必会-组合查询
多数 SQL 查询只包含从一个或多个表中返回数据的单条SELECT语句.但是, SQL 也允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回.这些组合查询通常称为 并( unio ...
- 《MySQL必知必会》学习笔记——组合查询、全文本搜索
文章目录 第17章 组合查询 1. 创建组合查询 2. UNION规则 3. 包含或取消重复的行 4. 对组合查询结果排序 第18章 全文本搜索 1. 理解全文本搜索 2. 使用全文本搜索 2.1 启 ...
- 多表查询、组合查询和约束
MySQL 一.多表查询 1.1 内连接 1.1.1 隐式内连接 1.1.2 显式内连接 1.2 外连接 1.2.1 左连接 1.2.2 右连接 1.3 子查询 二.组合查询 2.1 概念 2.2 u ...
最新文章
- SSM框架之批量增加示例(同步请求jsp视图解析)
- python26 调用mysql 5.1
- 2020-08淘宝特价版杀入短视频赛道,步步紧逼拼多多-10
- Struts2之路第一天
- 信佑无盘主服务器密码,(信佑无盘帮助手册.doc
- emui换鸿蒙内核,华为EMUI 11.1三月上线,安卓内核替换为鸿蒙内核
- 上传文件到某文件夹时,提示...路径访问被拒绝
- 【ZeroClipboard is not defined】的解决方法
- oracle 存储结构 语法 第一阶段
- matlab2c使用c++实现matlab函数系列教程-ones函数
- 【微信支付开发流程】
- jetson nano 人体姿态识别
- GD32F103移植FreeRTOS
- mysql phpmyadmin远程_phpMyAdmin远程连接mysql数据库
- 关闭默认共享-关于Windows的默认共享介绍
- [Err] 1418 - This function has none of DETERMINIST
- NVIDIA显卡系列
- 网速提升: 百度、阿里、114与运营商的DNS怎么选?
- Mysql 内置函数大全
- element-ui日期选择器设置禁止选择时间(禁止选择今天之前或包含今天)