最近由于项目需要,预研了下Elasticsearch,公司开发环境是Windows,为了图省事直接在本地安装。
安装很简单,下载压缩包解压之后即可使用,我下载的是5.1.1版本。
Elasticsearch从2.x版本直接升级到5.x版本,据说是因为统一他们家的产品的版本。
这样大的版本升级也导致了操作和API发生了很大的变化,网上对于5.x的实践也不是很多。

第一个坑

安装插件的时候,sense, Marvel等在2.X版本支持的插件,在5.X版本一概不支持,一直安装不上。
后来看了下官方文档,得知5.X版本已经将插件全部集集成在X-Pack中。

第二个坑

为了方便对Elasticsearch进行管理和测试,我装了个Kibana,Elasticsearch通过离线安装X-Pack十分顺利,Kibana安装的时候则出现了问题。
按照官方文档说明,使用以下命令安装即可

1
bin/kibana-plugin install file:///path/to/file/x-pack-5.1.2.zip

但是我用这个命令一直提示找不到zip包,网上搜了下没有找到原因,于是去Github上翻了下issue,有人遇到了同样的问题,并提供了如下方案

1
bin/kibana-plugin install file://path/to/file/x-pack-5.1.2.zip

第三个坑

接下来就是其Java API的使用,这里吐槽一下,官方提供的文档很不详尽,只对几个API进行了说明。
一开始在连接Elasticsearch的时候就出现了问题。
按官方文档说明(稍微改动了下),

1
2
3
4
5
6
7
Settings settings = Settings.builder()
.put("cluster.name", "myClusterName").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));

client.close();

一直报类似如下的错误

1
None of the configured nodes are available

我一开始Google了很多,Stackoverflow上大致总结的出现这个问题一般有以下几个原因:

  1. elasticsearch.yml中配置了cluster.name但是代码中写的不对
  2. 代码中端口写的是9200端口,应该是9300端口,9200端口是HTTP端口

最后在一个人的博客里提到,5.X版本安装X-Pack插件之后会导致上面的错误,我重新解压了一个干净的Elasticsearch,问题解决。
总之十分诡异,不知道算不算是一个BUG,但也不能十分确定是X-Pack导致的这个问题。

在整个Java API使用的过程中,感觉体验不是很好。

  1. 文档不完善
  2. 假如你要实现同一个功能,你可以有很多种不同的写法,可以用各种不同的类、不同的方法,五花八门,感觉是为了兼容历史版本所导致的。再有就是方法名、类名不是很清晰。总而言之比较混乱。

目前已经把所有要用的接口自己再封装了一遍,造了一些数据,写了几个搜索的页面,基本上已经能够使用了。
除了上面的我认为的缺点,不得不说Elasticsearch功能上还是很强大的,提供了丰富的接口;它屏蔽了很多底层Lucene的东西,学习成本也比较低。