1.1.1为什么要使用ElasticSearch来进行 查询
①,在海量数据查询中,MySQL的效率太低了
②,如果关键字输入的不准确,ElasticSearch一样可以搜索到想要的数据
③,将搜索的关键之以红色的字体展示
1.1.2 ElasticSearch的介绍
①,ELasticSearch是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的RestFul风格的WEB接口,官方客户端也对多种语言都提供了相应的API
1.1.2.1 Lucene:Lucene本身就是一个搜索引擎的底层,也提供了一些功能,但是Lucene的功能不是很全面,让用户去使用的时候是很麻烦的(Apache下的顶级项目)
1.1.2.2 ElasticSearch就是基于Lucene封装出来的,并且提供的功能更加完善
②,分布式:ES主要是为了突出它的横向扩展力,也就是搭建集群
④,全文检索:将一段词语进行拆分,并且将分出的单个词语统一的放到一个分词库中,在搜索的时候,关键字回到分词库1检索,找到匹配的内容(倒排索引)。
⑤,RestFul风格的WEB接口:操作ELasticSearch很简单,只需要发送一个HTTP请求,并且根据,请求方式的不同,携带参数的不同,执行相应的功能。
⑥,应用广泛:GItHub.com,WIKI,Gold Man用ElasticSearch每天维护10TB的数据
1.1.3 ES的由来
1.1.4 ElasticSearch和Solr的区别
①,Solr在查询死数据(死数据 就是 说固定的数据,一条不能多,也条不能少)的时候,速度相对于ElasticSearch更快一些。但是数据是实时改变的,Solr的查询熟读会降低很多,而ElasticSearch的查询效率基本上是没有变化的
②,搭建集区:Solr需要Zookeeper来帮助管理(这样的话成本就比较高了),而ElasticSearch本事就支持搭建集群,相对于Solr成本低一些,并且效率更高,并且ElasticSearch不需要第三方打的介入
③,最开始Solr的社区可以说是非常火爆的,针对国内的文档并不是很多,在ElasticSearch出现之后,ElasticSearch的社区火爆程度直线上升,ElasticSearch的文档是非常健全的
④,ElasticSearch现在云计算和大数据的支持的特别好
elasticsearch 与 solr 区别(2):
①,es 和 solr 都是 Java 语言开发的基于 Lucene 的搜索引擎.
②,es 天生支持分布式, solr 集群依赖 zookeeper 协调
③,es 只支持 json 格式存储, solr 支持 json /xml/pdf /csv 等
④,solr 在建立索引时, 查询性能下降, es 无此弊端
⑤,数据量大时, es 性能差别不大, solr 性能有一些下降
ElasticSearch中的查询顺序(倒排索引)
第一步:根据输入的关键字,去分词库中检索内容,并且获取响应的标识
第二步:根据分词库中检索到的标识,直接拉去指定的数据
1.1.4.1操作ES的RESTFul语法
1.GET请求:(get只能编写一些简单的查询(get的请求方式只能放到路径上))
①,Http:/ip:port/index; 查询索引信息 (Http:/ip地址:端口号/索引)
②,Http:/ip:port/index;/type/doc_id;指定文档信息 (Http:/ip地址:端口号/索引/type/索引id)
2.POST请求(post复杂的查询请求(post的请求方式可以在请求体中添加参数))
①,查询:Http:/ip:port/index/type/_search: 查询,可以再请求体中添加json字符串来代表查询条件。
②,修改:Http:/ip:port/index/type/_update:修改文档,在请求体中指定Json字符串代表修改的具体信
息。
3.PUT请求(增加):
①,添加索引:Http:/ip:port/index;:创建一个索引,需要在请求体中指定索引的信息,类型,结构
②,添加索引:Http:/ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储的属性的信息。(就相当于MySQL中创建表)
4.Delete请求(删除):
①,Http:/ip:port/index; 删除跑路
②,Http:/ip:port/index/type/doc_id:删除指定的文档
1.1.4.2 ElasticSearch中的number_of_shards(分片数)
假设 IndexA 有2个分片,我们向 Index A 中插入10条数据
(10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。
1.1.4.3 ElasticSearch中的number_of_replicas(备份数)
注:(在集群模式)ElasticSearch会将默认的备份数放到其他的服务器上
1.1.4.4 Field可以指定的类型
1.字符串(String)类型:
①,Test: 一般被用于全文检索,将当前Field进行分词
②,KeyWordcd :是不会被分词的。
2.数值类型(从大道小):
①,Long(-263~263-1):-2的63次方到次方2的63-1
②,Integer(-231~231-1): 它的大小是Long/2
③,Short(-32768 ~ 327671): ④,Byte(-128~127): 它的大小是Short/2
⑤,Double: 64位双精度IEEE 754浮点类型
⑥,Float: 32位单精度IEEE754浮点类型 它的大小是Double/2
⑦,half_float:16位半精度IEEE 754浮点类型 它的大小是Float/2
⑧,Scaled_float:缩放类型的的浮点数 根据一个long和scaled来表达一个浮点
3.时间类型
①,Date类型 针对时间类型指定具体的格式
4.布尔类型
①,Boolean用来表达true和false
1.1.4.5 创建索引并指定结构
注意:查看官网示例后发现 7.4 默认不在支持指定索引类型,默认索引类型是_doc
操作
添加:
查看索引:
删除索引:
新增文档
注意:文档在ELasticSearch服务中的唯一标识,_index,_type,_Id 三个内容为符合,锁定一个文档,操作是一个添加还是修改
①,自动生成_id
②,手动指定id
修改操作
1.覆盖式修改
2.doc修改(建议使用第二种)
删除操作
Java操作ElasticSearch
java添加索引属性
添加文档
修改文档
删除文档
批量添加
批量删除
ElasticSearch的各种查询
Trem&trems查询
trem的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字全文档分词库中去匹配内容
Java代码操作ElasticSearch中的trem
Trems查询
注意::trems和term查询机制是一样的,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到响应的文档内容
例如:
terms实在针对一个字段包含多个值得时候使用
Term: where peovice =北京
Terms: where pervoice = 北京 or provoice = ? or …
Java代码操作ElasticSearch中的trems
Match 查询
Match_all查询全部
注意:Match_all只是查询所有全部内容,不指定任何查询条件(除了分页)
Java代码操作ElasticSearch中的Match_all
Match查询
指定一个Field作为筛选条件(去ik分词器中查找获取响应的规则)
Java代码操作ElasticSearch中的Match
Match布尔查询
Java操作ElasticSearch的Match布尔查询
Multi_match查询
就相当于数据库中 select * from table where name = 封瑞and age=”封瑞”
Java操作ElasticSearch的Multi_Match布尔查询
根据Id查询
相当于select * from table where id in (40,20,4)
Prefix 按照按照开头查询
java查找ElasticSearch中的perfix查询
相当于MySQL中的 select * from table where name like “封%”
Fuzzy查询
模糊查询,我们输出的字符大概,ES就可以去输入的内容去匹配一下结果
java操作ElasticSearch中的Fuzzy查询
Wildcard查询
这个就相当于java中的通配符 例如:select * from where name like “封*”
java操作ElasticSearch中的Wildcard查询
Range查询
Java操作ElasticSearch中的Range查询
Regexp查询
正则查询,通过你编写的正则表达式去匹配内容
Ps:prefix ,fuzzy,wildcard和regexp查询效率相对较低,要求效率比较低的时候,避免去使用
.