ElasticSearch5.x几个为什么

为什么ES6.0要抛弃_all字段?

将所有字段都拷贝到_all显然不太合理,而且就算禁用_all字段,还是有一个bug:

在mappings里禁用_all字段:

"_all": {
    "enabled": false
}

在query_string里,以星号作为查询条件时还是会查到东西:

{
  "query": {
    "query_string": {
      "default_field": "_all",
      "query": "*"
    }
  }
}

但是在match里查询却查不到任何东西:

{
  "query": {
    "match": {
      "_all": "xx"
    }
  }
}

为什么ES的docker容器将9300端口映射出来之后就启动不起来?

以前ES客户的通过transport的方式连接ES,使用的是9300端口,走的是tcp协议。ES5.x开始尝试使用REST的方式连接ES,并且以后可能会放弃transport的方式,所以他们在做ES镜像时有意把9300隐藏掉,限制的比较紧,就算你修改ulimit,在CentOS6.7下也挺难的。

首先你得进入到容器里面把配置文件改了,commit成一个新的镜像,然后在启动的时候加上--ulimit和--ulimit nproc参数。

docker run -d --ulimit nofile=65536:131072 --ulimit nproc=2048:2048 -p 9200:9200 -p 9300:9300 -v /home/esdata:/usr/share/elasticsearch/data es:v5.5.1 -Ehttp.cors.enabled=true -Ehttp.cors.allow-origin=* -Etransport.host=0.0.0.0 -Ediscovery.zen.minimum_master_nodes=1

或者你先不映射9300端口,先让容器跑起来,然后用 docker -cp命令把ES容器里的配置文件拷贝出来,在容器外将配置文件改了,这样就不用commit一个新的镜像了。配置文件elasticsearch.yaml需要修改的地方是:

network.host: x.x.x.x (your index server ip)
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
http.cors.enabled: true
http.cors.allow-origin: "/.*/"

然后再new一个新的容器的时候可以加上-p 9300:9300。 但是即使这样,在有些情况下启动的时候还是会报错,大多数是ulimit的问题,很烦人。在ubuntu下稍微好点。

所以,使用ES docker的时候还是不要试图打开9300端口了,这个9300本来就要废弃了,所以没必要折腾了。

上一篇:桌面应用开发的新秀——webview


下一篇:C++模板别名的理解