ElasticSearch搭建

来源:互联网 发布:淘宝兼职 刷单怎么 编辑:程序博客网 时间:2024/05/16 00:46

1:简介

Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。

它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。

Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。
但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。

Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。

当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:
* 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
* 实时分析的分布式搜索引擎。
* 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。

Elasticsearch的上手是非常简单的。它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,
它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力

优点

  • Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
  • Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
  • 处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
  • Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
  • 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。

缺点

  • 只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
  • 还不够自动(不适合当前新的Index Warmup API)

2:下载

当前最新版本为5.1.1,需要安装jdk1.8才可以支持,下载地址为:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gz

我们本地使用的是jdk1.7,因此安装es版本为2.4.3,下载地址为:
https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.3/elasticsearch-2.4.3.tar.gz

3:安装部署

安装步骤,可以参考官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/_installation.html

注:本文所有讲述,都是基于2.4.3这个版本实现

4:配置

# =============== Elasticsearch Configuration ==================#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网#段下有多个集群,就可以用这个属性来区分不同的集群。cluster.name: elasticsearch#节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt#文件中,其中有很多作者添加的有趣名字node.name: node-1node.rack: r1#指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master#,如果这台机挂了就会重新选举master。node.master: true#指定该节点是否存储索引数据,默认为true。node.data:true#设置默认索引分片个数,默认为5片。ndex.number_of_shards: 5#设置默认索引副本个数,默认为1个副本。index.number_of_replicas: 1#设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号#隔开,例:path.data: /path/to/data1,/path/to/data2path.data: /path/to/data#设置日志文件的存储路径,默认是es根目录下的logs文件夹path.logs: /path/to/logs#设置临时文件的存储路径,默认是es根目录下的work文件夹。path.work: /path/to/work#设置插件的存放路径,默认是es根目录下的plugins文件夹path.plugins: /path/to/plugins#bootstrap.memory_lock: true#设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址network.publish_host: 192.168.0.1#这个参数是用来同时设置bind_host和publish_host上面两个参数network.host: 192.168.0.1#设置对外服务的http端口,默认为9200。http.port: 9200#设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大#的集群来说,可以设置大一点的值(2-4)discovery.zen.minimum_master_nodes: 3#设置集群中N个节点启动时进行数据恢复,默认为1gateway.recover_after_nodes: 3#默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的es只启动一个节点,#可以进行如下设置:node.max_local_storage_nodes: 1#设置是否可以通过正则或者_all删除或者关闭索引action.destructive_requires_name: true#设置新节点被启动时能够发现的主节点列表(主要用于不同网段机器连接):discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]#设置是否可以通过正则或者_all删除或者关闭索引action.destructive_requires_name 默认false 允许 可设置true不允许 

我的简易配置如下:

cluster.name: elasticsearchnode.name: node-1network.host: 0.0.0.0http.port: 9200action.destructive_requires_name: true

注意: 属性配置的“:”,必须增加空格,否则无法解析

5:启动

cd ${eclastic_Home}/bin
./elasticsearch

守护进程方式启动:
./elasticSearch -d

日志可以在
${elasticSearch/log/elasticSearch.log}中查看

[2016-12-19 16:26:16,749][INFO ][env                      ] [node-1] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [34.9gb], net total_space [39.2gb], spins? [unknown], types [rootfs][2016-12-19 16:26:16,749][INFO ][env                      ] [node-1] heap size [1015.6mb], compressed ordinary object pointers [true][2016-12-19 16:26:16,750][WARN ][env                      ] [node-1] max file descriptors [65535] for elasticsearch process likely too low, consider increasing to at least [65536][2016-12-19 16:26:19,749][INFO ][node                     ] [node-1] initialized[2016-12-19 16:26:19,749][INFO ][node                     ] [node-1] starting ...[2016-12-19 16:26:19,818][INFO ][transport                ] [node-1] publish_address {172.17.250.128:9300}, bound_addresses {0.0.0.0:9300}[2016-12-19 16:26:19,824][INFO ][discovery                ] [node-1] elasticsearch/WSTp3sljTYmW3kAjmue7fg[2016-12-19 16:26:22,887][INFO ][cluster.service          ] [node-1] new_master {node-1}{WSTp3sljTYmW3kAjmue7fg}{172.17.250.128}{172.17.250.128:9300}{rack=r1}, reason: zen-disco-join(elected_as_master, [0] joins received)[2016-12-19 16:26:22,899][INFO ][http                     ] [node-1] publish_address {172.17.250.128:9200}, bound_addresses {0.0.0.0:9200}[2016-12-19 16:26:22,899][INFO ][node                     ] [node-1] started

6:测试

服务启动后,可在浏览器中输入${ip:port},访问,正常结果如下:

{  "name" : "node-1",  "cluster_name" : "elasticsearch",  "cluster_uuid" : "_na_",  "version" : {    "number" : "2.4.3",    "build_hash" : "d38a34e7b75af4e17ead16f156feffa432b22be3",    "build_timestamp" : "2016-12-07T16:28:56Z",    "build_snapshot" : false,    "lucene_version" : "5.5.2"  },  "tagline" : "You Know, for Search"}

7:插件安装

elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序

直接安装:

运行命令:bin/plugin install mobz/elasticsearch-head

下载zip安装:

1:https://github.com/mobz/elasticsearch-head2:建立elasticsearch-1.0.0\plugins\head\_site文件3:elasticsearch-head-master文件夹下的文件copy到_site

访问:http://localhost:9200/_plugin/head/

image

亦可参考:http://blog.csdn.net/july_2/article/details/24481935

6:一些基本概念

在Elasticsearch中存储数据的行为就叫做索引(indexing),不过在索引之前,我们需要明确数据应该存储在哪里。在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,这样说可能不是很好理解,这里贴出一张es和关系型数据库的对应图,就懂了

在数据层面,可以和数据库做对比:

数据库 ES 数据库实例 索引(index) 表 类型(type,也叫mapping) 一行记录 文档(document) 字段 文档(fields)

在服务层面,主要有:

  • Node: 一个server实例。
  • Cluster:多个node组成cluster。
  • Shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。
  • Replica:shard的备份,有一个primary shard,其余的叫做replica shards。

7:教程样例

ES命令基本语法:
es采用restful风格访问集群,基本语法结构如下:

curl ${httpMethod} ${ip}: ${port}/${index}/${type}/ ${json}httpMethod,POST新增,PUT更新,GET获取,DELETE删除,HEAD判断是否存在新增:    curl -XPUT '/dept/employee/31' -d '{ "empname": "sunshine"}'查询:    http GET :9200/blog/article/1删除:    http DELETE :9200/blog/article/1是否存在:    http HEAD :9200/blog/article/1

操作后,可在视图见面查看,如下:
image

8:JavaAPI

Elasticsearch 的Java API 提供了非常便捷的方法来索引和查询数据等。 通过添加jar包,不需要编写HTTP层的代码就可以开始着手进行连接到Elasticsearch的工作。它提供了两种方法连接到Elasticsearch:创建一个本地节点并加入集群(cluster),或者利用传输(transport)。这两种方法都是利用一个Client(org.elasticsearch.client.Client)实例来实现的。

使用第一种方法的思想,是讲创建的本地节点作为集群的一部分,这样这个创建的本地节点就可以是知道整个集群的情况,比如relevant shard是如何分配的已经如何进行高效的查询。

Node node = nodeBuilder().clusterName("escluster2").client(true).node();  Client client = node.client();

  使用NodeBuilder来创建一个node,使用clusterName()方法来指定我们想要连接的集群。为了避免本地节点关机后集群将shard移动到本地节点,从而造成数据丢失的情况,我们需要client(true);

  第二种方法:通过ImmutableSettings我们设置了希望连接的集群的名称,接下来创建了一个TransportClient,通过建立InetSocketTransportAddress实例来提供Elasticsearch server所在的IP地址已经传输层的监听端口(JAVA API 默认9300,并非REST API的9200 )。

public void initTransPortClient() {    Settings settings = Settings.settingsBuilder().put("cluster.name", "esClusterTest").build();    try {    client = TransportClient.builder().settings(settings).build()        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("60.205.179.28"), 9300));    } catch (Exception e) {    e.printStackTrace();    }}

  关于两种方法的选择,第一种方法:建立本地节点会需要一些时间,但是在执行一些操作的事情会节省很多时间,因为本地阶段知道整个集群中indice和shard情况。 第二种方法:建立TransportClient是比较高效的,但是发送查询信息以及数据就需要更多的资源,因为TransportClient不清楚整个集群的拓扑,所以她不能直接将数据发送到目的节点,而是发送至一个初始化后的transport节点,ElasticSearch完成接下来的转发。
  注意:如果需要连接到不用网络中的Elasticsearch集群,就必须使用第二种方法(TransportClient对象)。
  
查询

QueryBuilder queryBuilder = QueryBuilders.disMaxQuery()    .add(QueryBuilders.matchPhrasePrefixQuery("title", "Shell"));SearchResponse response = client.prepareSearch("blog").setQuery(queryBuilder).execute().actionGet();for (SearchHit hit : response.getHits().getHits()) {    System.out.println("---->>hit.getId(): " + hit.getId());    System.out.println("title: " + hit.getSource().toString());}

9:ES的Spring配置

大多数情况下,我们不会自主去写客户端,更多的时候是通过spring配置,利用spring的容器管理机制配合使用。

0 0
原创粉丝点击