elasticsearnch入门
elasticsearnch入门
一. 是什么
隐藏Lucene复杂性,简单的RESTful API
- Lucene和全文搜索
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
二. 安装
Marvel管理和监控
./bin/plugin -i elasticsearch/marvel/latest
# 关闭
echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml
运行elasticsearch
./bin/elasticsearch -d
#测试
curl 'http://localhost:9200/?pretty'
#关闭
curl -XPOST 'http://localhost:9200/_shutdown'
三. 插件
head
plugin install mobz/elasticsearch-head
http://192.168.14.128:9200/_plugin/head/
marvel需要安装在kibana上
plugin install license
plugin install marvel-agent 
# Kibana 能够力其他插件,需要重新安装一下
http://blog.csdn.net/gongzi2311/article/details/51699798
kibana
wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz
#下载之后解压,进入bin安装插件
bin/kibana plugin --install elasticsearch/marvel/latest
#运行kibana
bin/kibana &
#打开kinana
http://localhost:5601/
#关闭,查找到之后kill
fuser -n tcp 5601
sense
./bin/kibana plugin --install elastic/sense
四. API
java两种客户端 9300端口
- node client:客户端以无数据的节点加入集群,不存储数据当时知道数据位置
- Transport client:更轻量级,自己不加入集群
 RESTful API 9200端口,json格式
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
例子:计算集群中文档数量
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'
五. 面向文档
可以存储整个document
可以对文档进行:索引、搜索、排序、过滤
六. 索引
索引
文档属于一种类型,这些类型存储在索引中
与传统关系型数据库对比如下
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields
Elasticsearch集群可以包含多个索引(indices)(数据库)
每一个索引可以包含多个类型(types)(表)
每一个类型包含多个文档(documents)(行)
然后每个文档包含多个字段(Fields)(列)
索引(名词):代表数据库,相关文档存储的地方
索引(动词):把文档存储到索引里,以便可以查询,类似insert,如果文档存在,覆盖
倒排索引
文档中的所有字段都会被索引(拥有一个倒排索引)
例子:创建员工目录
为每个员工的文档(document)建立索引,每个文档包含了相应员工的所有信息。
每个文档的类型为employee。
employee类型归属于索引megacorp。
megacorp索引存储在Elasticsearch集群中。
curl -XPUT 'http://localhost:9200/megacorp/employee/1' -d'
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
'
#加入更多
PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}
上面的/megacorp/employee/1包含三部分信息
名字			说明
megacorp	索引名
employee	类型名
1			这个员工的ID
文档是这个json
七. 检索文档
HTTP方式
HTTP GET请求并指出文档的“地址”(索引、类型和ID)
查询某一员工
GET /megacorp/employee/1
{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing",
    "interests": [
      "sports",
      "music"
    ]
  }
}
原始文档存在_source字段中
同样可以使用GET检索文档,delete删除文档,head检查文档是否存在,put更新
搜索全部员工
默认会返回前10条内容,hits数组会包含全部内容
GET /megacorp/employee/_search
_search关键字,用q=限定条件
GET /megacorp/employee/_search?q=last_name:Smith
DSL方式
DSL(Domain Specific Language特定领域语言) json请求形式;
GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}
更复杂的搜索
添加filter,例子使用区域过滤
GET /megacorp/employee/_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 30 } <1>
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "smith" <2>
                }
            }
        }
    }
}
全文搜索
从about字段中搜索"rock climbing",_score是结果相关性评分
GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
短语搜索
同时包含rock和climbing,只需将match查询变成match_phrase查询即可
GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}
高亮我们的搜索
语句上增加highlight参数,把内容高亮
GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}
八. 聚合
数据上生成复杂的分析统计,类似GROUP BY
找出全部职员最大的共同兴趣
GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}
加上姓氏为smith条件,查找他们的最大兴趣爱好
GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}
聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄:
GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
增加avg_age字段显示所有该兴趣员工的平均年龄
九. 分布式
隐藏分布式系统的复杂性,底层自动完成
- 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
- 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
- 冗余每一个分片,防止硬件故障造成的数据丢失。
- 将集群中任意一个节点上的请求路由到相应数据所在的节点。
- 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号