1.Elasticsearch基本概念
1.Get Started 1.基础 ElasticSearch 高可扩展的开源全文搜索和分析引擎,可以快速搜索和分析大容量的数据 使用场景: 1.电商网站商品搜索 2.使用Logstash收集,转换log和事务数据,通过Logstash将这些数据导入到ElasticSearch中,然后搜索、整合这些数据,并根据需要挖掘(mime)有用的信息 3.构建电商中用户自定义的商品价格提醒推送系统(eg:某件商品低于一定价格时,推送给客户) 4.通过ElasticSearch存储大容量数据,然后用Kibana以可视化方式查看数据 基础概念: 1.Near Realtime(NRT) ElasticSearch是一个接近实时搜索的平台,即:文档加上索引、即可搜索 2.Cluster集群 --- 每个集群需要指定一个唯一的名称(eg:log-dev,log-production),默认名称:elasticsearch 这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群 3.Node节点 --- 集群中的一个服务器,作为集群的一部分,用于存储数据、索引和查询 --- 需要指定一个唯一的名称 --- 可以配置加入到指定的Cluster集群(根据Cluster名称),默认node节点会加入到名为 elasticsearch的cluster中 --- 仅一个node节点启动时,会默认生成并加入一个名为elasticsearch的Cluster, 这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。 4.Index --- 具有相似特性的文档集,每个索引都有一个唯一的name(that must be all lowercase) --- 类似Mysql中的一个数据库 5.Type类型 --- 一个类型是你的索引的一个逻辑上的分类/分区 --- 类似Mysql中的表,或MongoDB中的集合 eg:通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。 在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。 6.Document文档 --- 文档时可被索引的基础信息单元,以JSON格式存储。 eg:客户文档,产品文档,订单文档 7.分片和复制(shards&replicas) 分片 --- 一个索引可以存储超出单个节点硬件限制的大量数据,单个节点的磁盘空间不足时,通过分片技术,将索引划分成多份处理。 当你创建一个索引时,可以指定你想要的分片的数量,每个分片本身也是一个功能完善并且独立的“索引”,这个"索引"可以被放置到集群中的任何节点上 分片的作用: 1.允许你水平分割/扩展内容容量 2.允许你在分片(潜在的多节点)之上进行分布式的、并行的操作,进而提高性能/吞吐量 复制 --- Elasticsearch允许创建分片的一份或多份拷贝 即:复制 复制作用: 1.在分片/节点失效时,提供了高可用性。 特别注意: 复制不要只与主分片置于同一个节点上!!!! 2.扩展搜索量/吞吐量,因为搜索可以在所有的复制上并行运行 特别注意: 1.每个索引可被分成多个分片。一个索引也可被复制0次或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。 2.分片和复制的数量可以在索引创建时指定,在索引创建后,你可在任何时候动态地改变复制的数量,但不能改变分片的数量 3.默认情况下,Elasticsearch中每个索引被分为5个主分片和1个复制,即:如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片 8.索引(index)的含义: ------ 特别注意!!!!!!!!!!!!! 1.名词,Elasticsearch中的一个索引类似于Mysql中的数据库,是存储文档的地方 2.动词,索引一个文档 -- 表示 把一个文档存储到索引(名词)里,以便它可以被检索和查询,类似SQL中的insert,但,差别是:如果文档已存在,新文档将覆盖旧文档 3.倒排索引(inverted index), 传统数据库为特定列增加一个索引,eg:B-Tree索引来加速检索。Elasticsearch使用一种叫倒排索引的数据结构来达到相同目的 2.安装 1.依赖JDK1.7+ Linux下检查 java -versoin echo $JAVA_HOME Windows下检查 java -version echo %JAVA_HOME% 2.解压 Linux下 tar -xvf elasticsearch-2.0.0-rc1.tar.gz 进入bin目录 cd elasticsearch-2.0.0-rc1/bin 启动 ./elasticsearch 注意: 启动时重写集群和节点名字 ./elasticsearch --cluster.name my_cluster_name --node.name my_node_name Linux下的操作:通过curl Windows下 启动 bin/elasticsearch.bat Windows下的操作 1.需要安装head插件: --- 注意head插件不支持Elasticsearch 2.x E:\新技术\ElasticSearch\elasticsearch-2.0.0\bin>plugin install mobz/elasticsearch-head 2.通过head插件操作 http://localhost:9200/_plugin/head/ Linux下安装head插件 sudo elasticsearch/bin/./plugin -install mobz/elasticsearch-head 启动信息提供了有关HTTP地址(127.0.0.1)和端口(9200)的信息,通过这个地址和端口我们就可以访问我们的节点了。 默认情况下,Elasticsearch使用9200来提供对其REST API的访问。如果有必要,这个端口是可以配置的。 3.Elasticsearch集群 1.Rest API接口 原则: 1.操作URL格式 http://IP:9200/<index>/<type>/[<id>] 2.增删改查对应的方式 增 POST 删 DELETE 改 PUT 查 GET 3.检索URL格式 -- 使用 _search接口 http://IP:port/index/type/_search 查询方式: query查询语句,通过POST方式发送给ES Restful 接口URL的格式: http://IP:9200/<index>/<type>/[<id>] index、type是必须提供的 id可选,不提供的话es会自动生成 index、type将信息进行分层,利于管理 index 可理解为数据库,type理解为表,id相当于数据库表中记录的主键,是唯一的 Elasticsearch提供了非常全面和强大的REST API,利用这个REST API你可以同你的集群交互 利用Rest API可以做的几件事情 1.检查集群、节点和索引的健康状态,和各种统计信息 2.管理集群、节点、索引数据和元数据 3.对索引进行CRUD和搜索操作 4.执行高级查询操作,eg:分页、排序、过滤、脚本编写、聚合和其他的查询操作 2.集群健康 1、查看集群状态 http://localhost:9200/_cat/health?v 得到结果: epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1446187805 14:50:05 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0% 分析: 集群名字 elasticsearch 状态 绿色 正常运行 一共有一个节点,由于里面没有数据,我们有0个分片 说明: 当我们询问集群状态的时候,我们要么得到绿色、黄色或红色。绿色代表一切正常(集群功能齐全),黄色意味着所有的数据都是可用的, 但是某些复制没有被分配(集群功能齐全),红色则代表因为某些原因,某些数据不可用。注意,即使是集群状态是红色的, 集群仍然是部分可用的(它仍然会利用可用的分片来响应搜索请求),但是可能你需要尽快修复它,因为你有丢失的数据。 2、查看node节点列表 http://localhost:9200/_cat/nodes?v 得到结果: host ip heap.percent ram.percent load node.role master name 127.0.0.1 127.0.0.1 4 55 -1.00 d * Super Sabre 分析: Super Sabre这个节点是集群中的唯一节点 3、查看所有索引 http://localhost:9200/_cat/indices?v 得到结果: health status index pri rep docs.count docs.deleted store.size pri.store.size 4.创建索引 eg: 创建一个 customer 的索引,然后列出所有的索引 curl -XPUT 'localhost:9200/customer?pretty' curl 'localhost:9200/_cat/indices?v' 响应: curl -XPUT 'localhost:9200/customer?pretty' { "acknowledged" : true } curl 'localhost:9200/_cat/indices?v' health index pri rep docs.count docs.deleted store.size pri.store.size yellow customer 5 1 0 0 495b 495b 解析: 第一个命令使用PUT创建了一个叫 customer的索引 pretty附加到调用尾部,使其响应的JSON更加美观 第二个命令查询所有索引,得到一个叫customer的索引,并它由5个主分片和1份复制(都是默认值),其中包含0个文档 创建索引时指定分片和复制的数量 eg: 1.YAML格式 curl -XPUT 'http://localhost:9200/twitter/' -d ' index: number_of_shards:3 number_of_replicas:2 ' 2.JSON格式 curl -XPUT 'http://localhost:9200/twitter/' -d '{ "setting":{ "index":{ "number_of_shards":3, "number_of_replicas":2 } } }' 或简化为 curl -XPUT 'http://localhost:9200/twitter/' -d '{ "index":{ "number_of_shards":3, "number_of_replicas":2 } }' 5.索引(保存)和查询一个文档 --- 类似Mysql的insert和query操作 特别注意: 为了索引一个文档,首先必须告诉Elasticsearch这个文档要到这个索引的哪个类型(type)下去找 1.索引(保存)一个客户文档到到Customer索引中 --- 类似 新建一个文档放到Customer索引库中,需要指定文档所属的type类型 对比SQL理解: 将一条记录(文档)存入数据库(索引),需要指定存入那张表(type) eg:将一个文档索引(保存)到customer索引库(数据库)的external类型(表)中, curl -XPUT 'localhost:9200/customer/external/1?pretty' -d ' { "name":"Jay He" }' 说明: 在创建一个文档时,如果需要存放的索引库不存在,则会自动创建该索引库,即:如果customer索引库不存在,则会自动创建 2.查询文档 eg: curl -XGET 'localhost:9200/customer/external/1?pretty' 响应: curl -XGET 'localhost:9200/customer/external/1?pretty' { "_index" : "customer", "_type" : "external", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "name": "Jay He" } } 6.删除索引 eg: 删除customer索引,并再次列出所有索引 curl -XDELETE 'localhost:9200/customer?pretty' curl 'localhost:9200/_cat/indices?v' 响应: { "acknowledged" : true } 表明成功删除了这个索引 7.总结: REST API 访问Elasticsearch中数据的一个通用模式: curl -<Rest Verb> <Node>:<Port>/<Index>/<Type>/<ID>
2.Elasticsearch基本操作
1.创建索引
2.创建文档
3.索引文档查询
4.更新索引文档
5.删除索引文档
6.索引文档的检索
1、首先将如下数据提交到ES中建立索引
{"number":32768,"singer":"杨坤","size":"5109132","song":"今夜二十岁","tag":"中国好声音","timelen":319}
{"number":32769,"singer":"汪峰","size":"6001697","song":"我爱你中国","tag":"中国好声音","timelen":375}
{"number":32780,"singer":"汪峰","size":"4070469","song":"我如此爱你","tag":"中国好声音","timelen":254}
{"number":32796,"singer":"大小姐","size":"3046005","song":"登大人","tag":"儿歌","timelen":190}
{"number":32896,"singer":"Bandari","size":"3869593","song":"The Golden Land","tag":"胎教音乐","timelen":241}
{"number":32977,"singer":"Bandari","size":"3477514","song":"Childhood Memory","tag":"欧美","timelen":217}
2.Elasticsearch query DSL
搜索的RESTful接口是_search
URL形式:http://ip:port/index/type/_search
query查询语句通过POST的方式发送到ES。
a、基本的全文检索
查找索引库中包含"音乐"的记录
{
"query": {
"query_string": {
"query": "音乐"
}
}
}
b、指定字段进行检索
查找song字段中含有中国的记录
{
"query": {
"query_string": {
"query": "中国",
"fields": [
"song"
]
}
}
}
c、多字段权重查询
在song、tag两个字段中搜索关键字“中国”,如果在song字段中出现权重是2,tag中是默认的1。通过结果可以看到歌曲名中含有中国是排在前面。
{
"query": {
"multi_match": {
"query": "中国",
"fields": [
"song^2",
"tag"
]
}
}
}