为什么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本来就要废弃了,所以没必要折腾了。