一、安装 (以下都是在虚拟机centos6.5上进行)
1.安装java,注意:装java8.x就可以,java9.x不行,elasticsearch5.x不支持,我装的是5.6.6。
2.安装Elasticsearch,直接按照官网下载tar包,按照提示安装即可
3.安装Sense,是一个Kibana提供交互式控制台,通过浏览器直接向elasticsearch提交请求。测试时可以用Kibana来看效果,也可以直接用http请求查看。
4.启动Elasticsearch和Kibana,可能有些需要配置IP和端口
二、和Elasticsearch交互
1.所有其他语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,可以用web,也可以直接用curl命令
2.Kibana的DSL(领域特定语言),实际上是简写了curl请求,比如
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
三、与传统DB区别
1.关系型数据库通过行和列存储对象,把一个表现力丰富的对象存储在一个非常大的电子表格中,需要将对象扁平化来适应表结构,而且每次查询时需要重新构造对象
2.Elasticsearch是面向文档的,存储整个对象或文档(使用json作为文档序列化格式),还可以索引每个文档的内容使之可以被检索,实际中,是对文档进行索引,检索,排序,和过滤,而不是对行列数据,是一种完全不同的思考数据的方式,也是Elasticsearch能支持复杂全文检索的原因
四、实操
初次体验:计算集群中文档的数量
curl -XGET ‘http://localhost:9200/_count?pretty’ -d ‘{
“query”: {
“match_all”: {}
}
}’
{
“count”: 4,
“_shards”: {
“total”: 6,
“successful”: 6,
“skipped”: 0,
“failed”: 0
}
}
1.索引雇员文档
索引(名词):如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引(动词):索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。
一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。一个文档代表一个雇员。存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
存储3个雇员,用的是postman的PUT方式
megacorp 索引名称
employee 类型名称
1 特定雇员的ID
http://192.168.190.136:9200/megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
返回
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
http://192.168.190.136:9200/megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
http://192.168.190.136:9200/megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
2.检索文档
在步骤1中存储了一些数据,现在可以检索单个雇员数据了
http://192.168.190.136:9200/megacorp/employee/3
返回
{
"_index": "megacorp",
"_type": "employee",
"_id": "3",
"_version": 3,
"found": true,
"_source": {
"first_name": "Douglas",
"last_name": "Fir",
"age": 35,
"about": "I like to build cabinets",
"interests": [
"forestry"
]
}
}
3.搜索
检索全部雇员数据
http://192.168.190.136:9200/megacorp/employee/_search
返回
{
"took": 34,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 1,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 1,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "3",
"_score": 1,
"_source": {
"first_name": "Douglas",
"last_name": "Fir",
"age": 35,
"about": "I like to build cabinets",
"interests": [
"forestry"
]
}
}
]
}
}
检索Smith
GET /megacorp/employee/_search //Kibana的Dev Tools
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
返回
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.2876821,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 0.2876821,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 0.2876821,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
}
}
搜索年龄大于等于30
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
返回
{
"took": 32,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 0.2876821,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
}
]
}
}
全文搜索,喜欢攀岩的雇员
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
返回
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.53484553,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 0.53484553, 相关性得分
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 0.26742277, 相关性得分
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
}
]
}
}
检索分析
聚合(aggregations),基于数据生成一些精细的分析结果,与SQL中的group by 类似但更强大
挖掘出最受欢迎的兴趣爱好
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
返回
"aggregations": {
"all_interests": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "forestry",
"doc_count": 1
},
{
"key": "sports",
"doc_count": 1
}
]
}
}
查询特定兴趣爱好员工的平均年龄:
GET /megacorp/employee/_search
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
返回
"aggregations": {
"all_interests": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "music",
"doc_count": 2,
"avg_age": {
"value": 28.5
}
},
{
"key": "forestry",
"doc_count": 1,
"avg_age": {
"value": 35
}
},
{
"key": "sports",
"doc_count": 1,
"avg_age": {
"value": 25
}
}
]
}
}
这是一篇入门Elasticsearch的教程,体现了构建高级搜索功能也不是那么难,后续会有更加深入的文章,敬请期待。