1.简单谈谈Elasticsearch----搜索引擎
基于数据库搜索:
站内搜索(垂直搜索):数据量小,简单搜索,可以使用数据库。问题出现:存储问题。电商网站商品上亿条时,涉及到单表数据过大必须拆分表,数据库磁盘占用过大必须分库(mycat )。性能问题:解决上面问题后,查询 “ 笔记本电脑 ” 等关键词时,上亿条数据的商品名字段逐行扫描,性能跟不上。不能分词。如搜索 “ 笔记本电脑 ” ,只能搜索完全和关键词一样的数据,那么数据量小时,搜索“ 笔记电脑 ” , “ 电脑 ”数据要不要给用户。
互联网搜索
数据量太大。PB 级。我们可以使用搜索引擎来解决数据库搜索的问题: 搜索也是数据库,搜索可以进行分词搜索,速度很快。
常见的搜索引擎:
![](https://i-blog.csdnimg.cn/blog_migrate/91877c586be93279ac3cb005c9b53e9f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/44a88255060b9e700fe52ed305291438.png)
![](https://i-blog.csdnimg.cn/blog_migrate/219284f7ef3114a3fc008f22a131c2f7.png)
1 、 es 基本是开箱即用 ( 解压就可以用 !) , 非常简单。 Solr 安装略微复杂一丢丢!2 、 Solr 利用 Zookeeper 进行分布式管理 , 而Elasticsearch<mark>自身带有分布式协调管理功能 </mark> 。3 、 Solr 支持更多格式的数据 , 比如 JSON 、 XML 、 CSV , 而Elasticsearch仅支持 json 文件格式。4 、 Solr 官方提供的功能更多 , 而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana 友好支撑5.Solr 查询快 , 但更新索引时慢 ( 即插入删除慢 ) ,用于电商等查询多的应用;ES 建立索引快 ( 即查询慢 ) ,即实时性查询快,用于 facebook 新浪等搜索。Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。6 、 Solr 比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch 相对开发维护者较少 , 更新太快 , 学习使用成本较高。
Elasticsearch 是什么
Elasticsearch的使用场景
- 维基百科,类似百度百科,“网络七层协议”的维基百科,全文检索,高亮,搜索推荐
- Stack Overflflow(国外的程序讨论论坛),相当于程序员的贴吧。遇到it问题去上面发帖,热心网友下面回帖解答。
- GitHub(开源代码管理),搜索上千亿行代码。
- 电商网站,检索商品
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅《java编程思想》的监控,如果价格低于27块钱,就通知我,我就去买。
- BI系统,商业智能(Business Intelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节的销售量最好、利润最高。成本管理,店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。
- 百度搜索,第一次查询,使用es。
- OA、ERP系统站内搜索。
2.安装elasticsearch
![](https://i-blog.csdnimg.cn/blog_migrate/622ba0be7ab47ea06adfb731e993bfc5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9ce9921a527d5d97a438ce6344fcc19a.png)
3.Windows安装Kibana
![](https://i-blog.csdnimg.cn/blog_migrate/788b26cbdc07ad4d69177986fa34bd91.png)
4. ES中常见的概念
![](https://i-blog.csdnimg.cn/blog_migrate/3c874f19a7ec109d326d20563f894b36.png)
5. ES常用API接口
创建索引--数据库
有两种方式:
PUT /索引名称/类型名称/1 (创建索引并添加一条文档)
PUT /索引名称/类型(创建索引但不添加数据)
删除索引
DELETE /索引名
查询所有的索引
GET /_cat/indices?v
查看索引的结构
GET /索引名
添加文档--记录
两种添加方式
指定id的值(等同于修改,存在替换掉,不存在添加)
PUT /索引名/_doc(_doc:默认类型)/id值
不指定id
POST /索引名/_doc
查询文档--id查询
GET /索引名称/类型名称/id值
修改文档
指定所有的列修改,若只指定部分列,则其他的列消失
PUT /索引名/类型/id值
只修改部分列
POST /索引名/类型/id值/_update
删除文档
提交方式DELETE提交方式 根据不同的操作具有不同的提交方式restful风格
GET 查询
PUT 修改
POST 添加操作
DELETE 删除操作
查询所有的文档
GET /索引名/类型/_search
根据条件搜索
GET /索引名/类型/_search?q=字段名:字段值
把查询的数据封装成json数据
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
}
}
指定查询某些列
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
},
"_source":["字段名","字段名"]
}
分页查询
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
},
"_source":["字段名","字段名"]
"from":0,
"size":1
}
大于小于查询
gt : 大于 gte: 大于等于 lt: 小于 ,lte:小于等于
GET /索引名/类型/_search
{
"query":{
"range":{
"字段名":{
"gt":字段值
}
}
},
"_source":["字段名","字段名"],
"from":0,
"size":10
}
排序查询
asc 升序 desc 降序
GET /索引名/类型/_search
{
"query":{
"range":{
"字段名":{
"gt":字段值
}
}
},
"_source":["字段名","字段名"],
"from":0,
"size":10,
"sort":[
{
"字段名":{
"order":"asc"
}
}
]
}
多条件查询
且查询
select * from 表名 where 列=值 and 列=值........
must====等价于and
GET /索引名/类型/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"字段名":"条件值"
}
},
{
"match":{
"字段名":条件值
}
}
]
}
}
}
或查询
select * from 表名 where 列=值 or 列=值........
should等价于or
GET /索引名/类型/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"字段名":"条件值"
}
},
{
"match":{
"字段名":条件值
}
}
]
}
}
}
取反查询
select * from 表名 where 列!=18
must_not等价于!=
GET /索引名/类型/_search
{
"query":{
"bool":{
"must_not":[
{
"match":{
"字段名":"条件值"
}
}
]
}
}
}
高亮查询
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":"条件值"
}
},
"highlight":{
"pre_tags":"<font color='red'>",
"post_tags":"</font>",
"fields":{
"条件字段名":{}
}
}
}
返回给前端页面时,会显示高亮