目录
2.1.站内搜索(垂直搜索):数量小,简单搜索,可以使用数据库、
3.1.2.当实时建立索引时,Solr会产生io阻塞,查询性能较差,ElasticSearch具有明显的优势
3.1.3.随着数据量的增加,Solr的搜索效率会变得更低,而ElasticSearch 却没有明显的变化
电商网站商品上亿条时,涉及到单表数据过大必须拆分表,数据库磁盘占用过大必须分库(mycat)。
解决上面问题后,查询“笔记本电脑”等关键词时,上亿条数据 的商品名字段逐行扫描,性能跟不上。
如搜索“笔记本电脑”,只能搜索完全和关键词一样的数据,那么数据量小时,搜索“笔记电脑”,“电脑”数据要不要给用户
肯定不会使用数据库搜索,数据量太大,pb级别,我们可以使用搜索引擎来解决数据库搜索的问题: 搜索也是一款数据库,搜索可以进行分词搜索---搜索速度非常快
1.es基本是开箱即用(解压就可以用!)【南京】 ,非常简单。Solr 安装略微复杂一丢丢!
2.Solr 利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能
3.Solr 支持更多格式的数据,比如JSON、XML、 CSV ,而Elasticsearch仅支持json文件格式
4.Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心 功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
5.Solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用ES建立索引快(即查询慢) ,即实时性查询快,用于facebook新浪等搜索Solr是传统搜索应用的有力解决方案,但Elasticsearch更适用于新兴的实时搜索应用。
6.Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高
The Elastic Stack, 包括 Elasticsearch【搜索,分析】、 Kibana【可视 化】、 Beats 和 Logstash【数据的搜集】(也称为 ELK Stack)能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索,分析和可视化.Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 ElasticStack 技术栈的核心.它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
维基百科,类似百度百科,“网络七层协议”的维基百科,全文检索,高亮,搜索推荐
Stack Overflflow(国外的程序讨论论坛),相当于程序员的贴吧.遇到it问题去上面发帖,热心网友下面回帖解答。
GitHub(开源代码管理),搜索上千亿行代码.电商网站,检索商品日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅《java编程思想》的监控,如果价格低于27块钱,就通知我,我就去买。
BI系统,商业智能(Business Intelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节的销售量最好、利润最高。成本管理,店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。
百度搜索,第一次查询,使用es。
OA、ERP系统站内搜索。
安装JDK,至少1.8.0以上版本
java -version--查看版本
下载地址:https://www.elastic.co/cn/downloads/
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
Elasticsearch、Logstash和Kibana这三个技术就是我们常说的ELK技术栈,可以说这三个技术的组合是大数据领域中一个很巧妙的设计。一种很典型的MVC思想,模型持久层,视图层和控制层。Logstash担任控制层的角色,负责搜集和过滤数据。Elasticsearch担任数据持久层的角色,负责储存数据。而我们这章的主题Kibana担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在Elasticsearch中的数据。
下载地址:https://www.elastic.co/cn/downloads/
历史版本下载:https://www.elastic.co/cn/downloads/past-releases/
解压后,进入 bin 文件目录,点击kibana-keystore.bat文件启动 Kibana服务 。
Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档.为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库MySQL 存储数据的概念进行一个类比ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行.这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了
支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储
不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8 类型的字符,可以通过设置ignore_above指定自持字符长度,超过给 定长度后的数据将不被索引,无法通过term精确匹配检索返回结果
PUT /demo1(索引名)/_doc(类型)/1(文档)
{
"name":"李四",
"age":18
}注意:索引要小写,要不然会报错,put要大写
_doc 默认类型( default type), type 在 Elasticsearch 7.X 逐渐弃用, 因此产生一个默认类型进行代替
PUT /demo2(索引名)
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "integer"
}
}
}
}mappings:映射
properties:属性
GET /_cat/indices?v
DELETE demo2(索引名)
GET demo1(索引名)
PUT demo1/_doc/3
{
"name":"张三",
"age":12
}
POST demo1/_doc/
{
"name":"完好无",
"age":22
}
GET /demo1/_doc/3
GET /索引名称/类型名称/id值
DELETE /demo1/_doc/3
DELETE/索引名/类型/指定id的值
PUT /demo1/_doc/2
{
"name":"www",
"age":11
}
弊端:这种修改必须要求指定所有列,如果只指定部分列,则原来其他列消失
POST /demo1/_doc/2/_update
{
"doc":{
"name":"啊啊啊"
}
}
GET /demo1/_doc/_search
GET /索引名称/类型名称/_search?q=字段名:值
GET /demo1/_doc/_search?q=name:李四---模糊查询
PUT /user/_doc/1
{ "name":"刘民谐", "age": 18, "desc": ["有趣","幽默","开朗"]
}PUT /user/_doc/2
{
"name":"马老师", "age": 18, "desc": ["严谨","冷漠"]
}
PUT /user/_doc/3
{
"name":"流油", "age": 3, "desc":["美丽","年轻","苗条"] }
match:匹配(会使用分词器解析(先分析文档,然后进行查询)) eq
GET /user/_doc/_search
{
"query":{
"match":{
"name":"刘"
}
}
}
_source:过滤字段
GET /user/_doc/_search
{
"query":{
"match":{
"name":"刘"
}
},
"_source":["name","age"]
}
GET /user/_doc/_search
{
"query":{
"match":{
"age":18
}
},
"_source":["name","age"],
"from":1,
"size":1
}
range:代表范围查找
GET /user/_doc/_search
{
"query":{
"range":{
"age":{
"gt":2---大于
}
}
},
"_source":["name","age"],
"from":1,
"size":1
}
GET /user/_doc/_search
{
"query":{
"range":{
"age":{
"gt":2
}
}
},
"_source":["name","age"],
"from":0,
"size":5,
"sort":[
{
"age":{
"order":"desc"
}
}
]
}
GET /user/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"刘"
}
},
{
"match":{
"age":18
}
}
]
}
}
}
should 相当于 or
GET /user/_doc/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"刘"
}
},
{
"match":{
"age":18
}
}
]
}
}
}
must_not 相当于 not (... and ...)
GET /user/_doc/_search
{
"query":{
"bool":{
"must_not":[
{
"match":{
"age":18
}
}
]
}
}
}
GET /user/_doc/_search
{
"query":{
"bool":{
"filter":[
{
"range":{
"age":{
"lt":18
}
}
}
]
}
}
}
GET /user/_doc/_search
{
"query":{
"match":{
"name":"流"
}
},
"highlight":{
"pre_tags":"",
"post_tags":"",
"fields":{
"name":{}
}
}
}
text: 它会为该字段的内容进行拆词操作,并放入倒排索引表中
keyword: 它不会进行拆词操作
使用match匹配查询---对匹配的关键字进行拆词操作,并和倒排索引表中对应。
使用term精准匹配---它不会对关键字进行拆词操作,而且把关键字作为一个整体和倒排索引表进行匹配