赞
踩
全系的Elastic Stack技术栈包括:
官网:https://www.elastic.co/cn/products/elasticsearch
功能lasticsearch的功能
(1)分布式搜索和分析引擎
(2)全文检索,结构化检索,数据分析
(3)对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上存储和检索
海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
跟分布式/海量数据相反的,lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。
近实时:在秒级别对数据进行搜索和分析
yin
应用:
的适用11yingyong 场景
(1)维基百科,全文检索,高亮,搜索推荐
(2)新闻网站,用户日志+社交网络数据,分析
(3)Stack Overflow(国外的程序异常讨论论坛),全文检索,搜索相关问题和答案
(4)GitHub(开源代码管理),搜索上亿行代码
(5)电商网站,检索商品
(6)日志数据分析,logstash采集日志,ES进行复杂的数据分析
(7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发视消息给用户
(8)BI系统,ES执行数据分析和挖掘,Kibana进行数据可视化
(9)国内,站内搜索(电商,招聘,门户)
(10)BI 系统,商业智能,分析用户消费趋势和用户群体的组成构成。
特点
(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司,也可以运行在单机上,服务小公司
(2)Elasticsearch不是什么新技术,主要是将全文检索,数据分析以及分布式技术,合并在一起,才形成了独一无二的ES,lucene(全文检索)
(3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
(4)数据库的功能面对很多领域是不够的,优势:事务,各种联机事务型的操作,特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理,Elasticsearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。
{
"id":1002,
"name":"张三2",
"age":20,
"sex":"男"
}
{
"_index": "test",
"_type": "user",
"_id": "GD3qC3UBKjIIyQSLnnMI",
"_version": 1,
"result": "created",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
搜索全部数据
条件查询 年龄等于20的
高亮查询
{ "query": { "match": { "name": "张三 李四"} },"highlight": { "fields": { "name": {} } } }
在Elasticsearch中,支持聚合操作,类似SQL中的group by操作。
{ "aggs": { "all_interests": { "terms": { "field": "age" } } } }
从结果可以看出,年龄20的有2条数据
{"create":{"_index":"haoke","_type":"user","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"haoke","_type":"user","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"haoke","_type":"user","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}
批量删除
{"delete":{"_index":"haoke","_type":"user","_id":2001}}
{"delete":{"_index":"haoke","_type":"user","_id":2002}}
{"delete":{"_index":"haoke","_type":"user","_id":2003}}
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"mail": {
"type": "keyword"
},
"hobby": {
"type": "text"
}
}
}
}
查看映射:
1 GET /person/_mapping
效果如下:
插入数据:
- 1 POST /person/_bulk
- 2
- 3 {"index":{"_index":"person"}}
- 4 {"name":"张三","age": 20,"mail": "111@qq.com","hobby":"羽毛球、乒乓球、足球"}
- 5 {"index":{"_index":"person"}}
- 6 {"name":"李四","age": 21,"mail": "222@qq.com","hobby":"羽毛球、乒乓球、足球、篮球"}
- 7 {"index":{"_index":"person"}}
- 8 {"name":"王五","age": 22,"mail": "333@qq.com","hobby":"羽毛球、篮球、游泳、听音乐"}
- 9 {"index":{"_index":"person"}}
- 10 {"name":"赵六","age": 23,"mail": "444@qq.com","hobby":"跑步、游泳"}
- 11 {"index":{"_index":"person"}}
- 12 {"name":"孙七","age": 24,"mail": "555@qq.com","hobby":"听音乐、看电影"}
测试搜索:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "match": {
- 6 "hobby": "音乐"
- 7 }
- 8 }
- 9 }
效果如下:
term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
- 1 { "term": { "age": 26 }}
- 2 { "term": { "date": "2014-09-01" }}
- 3 { "term": { "public": true }}
- 4 { "term": { "tag": "full_text" }}
示例:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "term": {
- 6 "age": 20
- 7 }
- 8 }
- 9 }
效果如下:
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
格式:
- 1 {
- 2 "terms": {
- 3 "tag": [
- 4 "search",
- 5 "full_text",
- 6 "nosql"
- 7 ]
- 8 }
- 9 }
示例:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "terms": {
- 6 "age": [20, 21]
- 7 }
- 8 }
- 9 }
效果如下:
range 过滤允许我们按照指定范围查找一批数据:
- 1 {
- 2 "range": {
- 3 "age": {
- 4 "gt": 20,
- 5 "lt": 30
- 6 }
- 7 }
- 8 }
范围操作符包含:
示例:
示例:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "range": {
- 6 "age": {
- 7 "gt": 20,
- 8 "lt": 30
- 9 }
- 10 }
- 11 }
- 12 }
效果如下:
exists 查询可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件
- 1 {
- 2 "exists": {
- 3 "field": "title"
- 4 }
- 5 }
示例:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "exists": {
- 6 "field": "name"
- 7 }
- 8 }
- 9 }
效果如下:
match 查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析 match 一下查询字符:
- 1 {
- 2 "match": {
- 3 "tweet": "About Search"
- 4 }
- 5 }
如果用match下指定了一个确切值,在遇到数字,日期,布尔值或者not_analyzed 的字符串时,它将为你搜索你 给定的值:
示例:
- 1 POST /person/_search
- 2
- 3 {
- 4 "query": {
- 5 "match": {
- 6 "name": "孙七"
- 7 }
- 8 }
- 9 }
效果如下:
- 1 {
- 2 "bool": {
- 3 "must": {
- 4 "term": {
- 5 "folder": "inbox"
- 6 }
- 7 },
- 8 "must_not": {
- 9 "term": {
- 10 "tag": "spam"
- 11 }
- 12 },
- 13 "should": []
- 14 }
- 15 }
示例效果:
前面讲过结构化查询,Elasticsearch也支持过滤查询,如term、range、match等。
示例:查询年龄为20岁的用户。
查询和过滤的对比
建议:
做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。