Elasticsearch 6.3.2版本踩填坑指南
前言
前端时间利用ES开发一个"附近地理位置+其它信息"查询搜索的功能(据了解,Redis和PostgreSQL也能实现同样的功能),实践中遇到了不少的问题,所以通过这篇文章记录下踩填坑过程。
es with docker
个人喜好,一般使用中间件都喜欢用Docker运行较新版本的,用docker pull elasticsearch
命令拉下来的版本一般不会是最新的,所以可以从这里找到最新版本的拉取命令,稍加改造后我需要的是这样的:docker run --name elasticsearch -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2
注意到这里指定的镜像是elasticsearch-oss:6.3.2
,这个-oss
表示不包括X-Pack
的ES镜像,这也是在6.0+版本后划分的,剩下两种类型是basic
(默认)和platinum
,具体官方说明可以看下图。
如果启动失败,使用命令docker logs elasticsearch
查看日志即可,-f
参数用于监听,其中一种启动错误是要求你修改vm.max_map_count
这个系统环境参数,Linux可参考命令sysctl -w vm.max_map_count=262144
设置即可(其它系统在文末官方参考链接中有更详细介绍)。
create mapping
这部分是重点,之前遇到的坑就是type mapping这块。
- "_id is not configurable"
es2.0+版本中,_id
是可以配置的,网上也有一堆告诉你怎么设置,但es6.3.2中创建mapping并指定_id
配置的时候,es返回错误中就出现了上面那句,在社区可以找到了这个Discuss。高版本中的_id
是不能配置了,一般来说,在添加Document的时候,如果只指定Index和Document Type,那么es会随机给这个_id
分配一个值,但如果添加的时候指定这个_id
值,那么ES就不会再随机分配这个值。不过注意,即使你指定的_id
是一个数值,但在实际保存和返回中都是字符串类型;
- "Mapping with Index not_analyzed is not working"
这个问题在Github上也有相关的Issues,我在这里先还原下当初创建mapping的配置:
{ "properties": { # 当初的想法是指定shopId这个字段不要分析,然后keyword字段要进行分析 "shopId": { "type": "integer", "index": "not_analyzed" }, "location": { "type": "geo_point" }, "keyword":{ "type": "text", "index": "analyzed", "analyzer": "ik_max_word" } } }
创建完上述mapping后访问http://localhost:9200/{index}/{type}/_mapping
,但返回结果(如下)和上面指定的mapping并不相同:
{ "{index}": { "mappings": { "{type}": { "properties": { "shopId": { "type": "integer" }, "location": { "type": "geo_point" }, "keyword": { "type": "text", "analyzer": "ik_max_word" }, } } } } }
之后还是在官方文档中找到答案,发现确实有两点值得记录一下。
第一点:es5.0之后,为字符串新增了
keyword
类型,而之前的版本中只有text
类型,通过index属性判断是否需要分词(默认分词)。es5.0之后使用keyword type代替index这个属性,所以指定"type": "text"
就是分词,指定"type": "keyword"
就是不分词;第二点:不需要为type为数字类型integer、long,日期类型date、布尔类型boolean等指定
"index": "not_analyzed"
属性(而且在高版本es中这也是错误的语法,index只能指定为"index": true | false
,false意味着不可查询),因为这些类型就是不分词的,如果要分词请修改为text类型。
ik analysis
IK是国内用得比较多的中文分词器,与ES安装集成也比较简单,首先进入dockerdocker exec -it elasticsearch bash
,然后用命令./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
安装即可(需对应es版本),安装完使用docker restart elasticsearch
重启服务即可。IK支持两种分词方式,ik_smart
和ik_max_word
,前者分词粒度没有后者细,可以针对实际情况进行选择。
head plugin
elasticsearch-head插件也是测试的时候用得比较多的插件,以前用ES2的时候是借助plugin脚本安装的,但这种方式在ES5.0之后被废弃了,然后作者也推荐了好几种方式,可以借助npm运行该服务,或者用docker运行服务,不过为了简单起见我最后选的是Chrome extension这种方式。
参考链接
Install Elasticsearch with Docker
Mapping
Text datatype
Keyword datatype
how-to-not-analyze-in-elasticsearch
elasticsearch-analysis-ik
elasticsearch-head
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Jeknins的Pipline方式构建任务
Jenkins通过Docker搭建(Dood) Docker安装Jenkins(DooD) Pipeline是Jenkins2.0以上版本提供的,利用Groovy语言提供构建,Gradle统一利用Groovy的语言特性作为构建工具,同时BlueOcean提供更简洁的页面以及其他特性 以下是BlueOcean切换页面,配置Pipleline 采用得了SCM方式而不是直接写入Groovy脚本 Jenkins-test中的Jenksinsfile Springboottest根目录下Dockfile 构建流程中 构建结束 可以查看自定义的四个阶段每个阶段的详细信息 由于第一次构建,需要从maven仓库中下载大量插件,我在项目的pom.xml配置了阿里的maven仓库,但是好像不起作用,反正构建时间很长 最新的Pipeline语法官方文档:https://jenkins.io/doc/book/pipeline/docker/
- 下一篇
OpenStack 上部署 Kubernetes 方案对比
Kubernetes on OpenStack 目前在 OpenStack 上部署 Kubernetes 有多种方式,本文会先简要描述每种方案,再使用图标进行简单的对比,并尝试给出个人认为的较优方案。 Tectonic Tectonic 由 CoreOS 开发,是开源企业级的 Kubernetes 部署解决方案,对 Kubernetes 做了一些改造,支持多集群管理(也就是支持多租户管理),更流畅的图形化管理等。但 Tectonic 主要的目标是在公有云上部署,比如 GCE、AWS 等,虽然也开始支持 OpenStack 等私有云,但目前还不够成熟,处于 pre-alpha 阶段,所以暂不考虑。 以下是在 OpenStack 上部署的官方文档:Deploy tectonic on OpenStack by Terraform kops Kubernetes 由 Kubernetes 社区开发,是一个部署 Kubernetes 的命令行工具,和 Tectonic 一样,主要的目标也是在公有云上部署 Kubernetes,而且对 OpenStack 的支持也不算好,目前处于...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果