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 查询,组合查询相关推荐

  1. 【ES】JavaAPI学习-07 组合查询 范围查询

    前言 本节主要实现条件查询中的组合查询,范围查询 实现 编写组合查询 ESTest_Doc_Cond_Query_Com.java package com.zwy.es;import org.apac ...

  2. Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.表的创建 ...

  3. 连表查询使用in_SQL 组合查询

    SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果返回. 使用UNION操作符,可以给出多条SELECT语句,将它们的结果组合成一个结果集. 1.使用UNION 给出每条SELE ...

  4. 数据库9:联结表 高级联结 组合查询 全文本搜索

    第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分. ...

  5. 机房收费--组合查询

    在学生基本信息维护这一窗体里,有一个组合查询,通过组合查询我们可以随意选择不同的条件,进而查询到自己想要查询的内容. 从上图我们不难看出,查询的条件是比较复杂一些,而且一个条件的设定就必须包含三个控件 ...

  6. 数据库系统实训——实验三——子查询与组合查询

    一.子查询与组合查询 题号:1 SQL语句描述: /SELECT ORDER_NUM FROM ORDERITEMS where prod_id='tnt2';/ /select cust_id fr ...

  7. 企业级系统应用,高级组合查询示例讲解 - Jeecg实战

    企业级系统应用,高级组合查询示例讲解 - Jeecg实战   ---数据多维度查询 经常会有人问:JEECG高级查询怎么用,实现机制是怎样的? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构 ...

  8. SQL必知必会-组合查询

    多数 SQL 查询只包含从一个或多个表中返回数据的单条SELECT语句.但是, SQL 也允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回.这些组合查询通常称为 并( unio ...

  9. 《MySQL必知必会》学习笔记——组合查询、全文本搜索

    文章目录 第17章 组合查询 1. 创建组合查询 2. UNION规则 3. 包含或取消重复的行 4. 对组合查询结果排序 第18章 全文本搜索 1. 理解全文本搜索 2. 使用全文本搜索 2.1 启 ...

  10. 多表查询、组合查询和约束

    MySQL 一.多表查询 1.1 内连接 1.1.1 隐式内连接 1.1.2 显式内连接 1.2 外连接 1.2.1 左连接 1.2.2 右连接 1.3 子查询 二.组合查询 2.1 概念 2.2 u ...

最新文章

  1. SSM框架之批量增加示例(同步请求jsp视图解析)
  2. python26 调用mysql 5.1
  3. 2020-08淘宝特价版杀入短视频赛道,步步紧逼拼多多-10
  4. Struts2之路第一天
  5. 信佑无盘主服务器密码,(信佑无盘帮助手册.doc
  6. emui换鸿蒙内核,华为EMUI 11.1三月上线,安卓内核替换为鸿蒙内核
  7. 上传文件到某文件夹时,提示...路径访问被拒绝
  8. 【ZeroClipboard is not defined】的解决方法
  9. oracle 存储结构 语法 第一阶段
  10. matlab2c使用c++实现matlab函数系列教程-ones函数
  11. 【微信支付开发流程】
  12. jetson nano 人体姿态识别
  13. GD32F103移植FreeRTOS
  14. mysql phpmyadmin远程_phpMyAdmin远程连接mysql数据库
  15. 关闭默认共享-关于Windows的默认共享介绍
  16. [Err] 1418 - This function has none of DETERMINIST
  17. NVIDIA显卡系列
  18. 网速提升: 百度、阿里、114与运营商的DNS怎么选?
  19. Mysql 内置函数大全
  20. element-ui日期选择器设置禁止选择时间(禁止选择今天之前或包含今天)

热门文章

  1. 《刺客信条:大革命》秋季登陆Xbox One
  2. 大型项目技术负责人应该具备的能力
  3. 工程伦理第十一章习题答案
  4. Android 工具类 大全
  5. Fabric2.0部署学习进阶教程系列博文
  6. 静态路由及三层交换机的配置
  7. vb.net编写的吃蘑菇小游戏(贪吃蛇)
  8. 冶金物理化学【10】--- 典型二元相图与三元相图
  9. You辉编程_JavaScript高级程序
  10. 海盗船键盘k70 PRO MINI无线机械键盘白色版,无线家族的优雅担当