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)中,它们可以存在于一个或多个节点中。
  • 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
  • 冗余每一个分片,防止硬件故障造成的数据丢失。
  • 将集群中任意一个节点上的请求路由到相应数据所在的节点。
  • 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。
posted @ 2016-09-14 14:37  zhangshihai1232  阅读(187)  评论(0)    收藏  举报