Elasticsearch 5.5 入门必会(一)

Stella981
• 阅读 609

前言

  • 安装搜索引擎过程中,我遇到了很多坑!发出来让各位绕道而行,后面都是用ES关键字来代替Elasticsearch,后面的搭建和使用都是在centos 6.8环境下,本人使用的ES是5.5.0的版本,JDK使用1.8版本。
  • 相关文章:

          Elasticsearch 5.5 入门必会之Java client(二)

          Elasticsearch 5.5 SQL语句转Java Client 及相关注意事项(三)

一、ES集群搭建

    1.linux添加单独用户,因为ES不能使用root用户启动,会报错!

java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:106) ~[elasticsearch-5.5.1.jar:5.5.1]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:194) ~[elasticsearch-5.5.1.jar:5.5.1]

groupadd search
#创建用户
useradd search-g search
#设置密码
passwd search

#创建es安装目录,并且用户授权
mkdir /opt/elasticsearch
cd /opt
chown -R search:search elasticsearch

    2. 切换到search用户,然后去官网下载es安装包,解压到/opt/elasticsearch目录解压。 

    3. 启动ES

cd elasticsearch/bin
./elasticsearch

     4.你可能遇到如下问题:

#这个是linux内核不支持 syscall filter,centos 7以上据说没这个问题,但是不影响使用
unable to install syscall filter: 
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
#通过配置后面第[4]个好像就没有报错了

#linux max file配置过低
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
#通过配置 /etc/security/limits.conf 解决
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096

#使用最大线程数过低
[2]: max number of threads [1024] for user [search] is too low, increase to at least [2048]
#通过配置/etc/security/limits.d/90-nproc.conf 解决
*  soft    nproc     2048

#虚拟内存配置太低
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
#通过配置 /etc/sysctl.conf 追加一行如下解决
vm.max_map_count=655360

#system call filters安装失败
[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
#解决办法通过配置 /opt/elasticsearch/config/elasticsearch.yml参数解决
bootstrap.memory_lock: false 
bootstrap.system_call_filter: false

     5. ES启动JVM配置,在config/jvm.options调整了一下jvm参数

-Xms8g
-Xmx8g

     6. 我的master的ES启动配置参数,集群服务器的115这个节点也是和一下配置类似,只是IP不一样

cluster.name: onesearch
node.name: master-node1
path.logs: /home/search/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 10.1.1.114
network.bind_host: 10.1.1.114
network.publish_host: 10.1.1.114
http.port: 9200

http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
#我配置了两个节点
discovery.zen.ping.unicast.hosts: ["10.1.1.114","10.1.1.115"]

   7. OK,现在启动master节点,您会看到日志就代表启动成功了

[2017-08-11T15:25:24,405][INFO ][o.e.n.Node               ] [ZikeeFb] started

  8. 然后在启动另外一个master节点的时候,您会看到日志里面提示另外一个节点已经连接,因为ES是自动发现节点的。

二、为ES安装head和ik分词器插件

  • head插件是一个很实用的插件,界面简介,即使您不使用http rest方式访问也会对您后面的开发有很大的帮助
  • ik中文分词器这个比较有名,好像paoding已经消失在历史长河中了,不多说。

     1. 安装head插件,在使用ES 5.5的时候,我在网上搜了一些文档,但是都过时了,5.5安装head插件还不如说是自己单独安装了一个node 然后跑了一个node程序去通过http接口访问es接口。网上文档都是一律的把插件解压到ES的plugins目录里面,然而,我并没有跑起来,或许是我自己的问题。下面介绍单独跑node来部署head程序吧

#安装node,安装目录你自己随意定了
wget https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-x64.tar.xz
#配置nodejs环境变量 编辑 /etc/profile ,我直接使用的root安装,这个所谓,主要安装node相关工具需要一些权限
export PATH=/root/node-v6.11.2-linux-x64/bin:$PATH

#安装git,这里注意下,如果是自动安装git 1.7的话 clone会报403错,我是自己手动下载安装了1.9
yum -y install git
#clone head插件源码
git clone git clone git://github.com/mobz/elasticsearch-head.git
#进入head插件目录执行
npm install grunt --save
npm install  #这个慢得一批
#安装grunt cli
npm install -g grunt-cli
#编辑Gruntfile.js里面的hostname
connect: {
        server: {
                options: {
                        port: 9100,
                        base: '.',
                        hostname: '0.0.0.0', ##这里,这里
                        keepalive: true
                }
        }
}
#编辑_site/app.js ,找到下面这一行,加行后面一截,如果IP不一样,你自己修改,我是和master部署到同一个节点的
 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200"; ## <-注意这里,自己加

#启动head程序
grunt server -d

#然后访问 http://IP:9100/ 即可看到简洁的界面

    head程序(我不叫插件,因为我单独部署的)界面如下:

Elasticsearch 5.5 入门必会(一)

     2. ik分词器插件安装,顺便说一句,使用yml配置方式来配置分词器已经在5.5不适用,启动会报错

#传说用的./elasticsearch-plugin install 方式来安装插件,我也没安装成功
#ik的github上提供了 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip 我没试,因为我用的另外一种方式安装成功了

#下载https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.2/elasticsearch-analysis-ik-5.5.2.zip

#在/opt/elasticsearch/plugins/下 创建ik目录
mkdir ik
#然后把 elasticsearch-analysis-ik-5.5.2.zip 解压到ik目录,重启ES即可
  •  测试分词器standard是es自带的,基本上就是一个字一个字的

    #!!注意 下面连接里面的 megacorp 是我通过head程序手动创建了一个索引 #浏览器访问http://10.1.1.114:9200/megacorp/_analyze?analyzer=standard&pretty=true&text=我是卡尔码农 #得到一下访问结果

    { "tokens" : [ { "token" : "我", "start_offset" : 0, "end_offset" : 1, "type" : "", "position" : 0 }, { "token" : "是", "start_offset" : 1, "end_offset" : 2, "type" : "", "position" : 1 }, { "token" : "卡", "start_offset" : 2, "end_offset" : 3, "type" : "", "position" : 2 }, { "token" : "尔", "start_offset" : 3, "end_offset" : 4, "type" : "", "position" : 3 }, { "token" : "码", "start_offset" : 4, "end_offset" : 5, "type" : "", "position" : 4 }, { "token" : "农", "start_offset" : 5, "end_offset" : 6, "type" : "", "position" : 5 } ] }

  •  测试IK分词器效果

    #浏览器请求http://10.1.1.114:9200/megacorp/_analyze?analyzer=ik_smart&pretty=true&text=我是卡尔码农 #其中analyzer=ik_smart可以换成analyzer=ik_max_word 是ik提供两种分词方式 #得到返回结果 { "tokens" : [ { "token" : "我", "start_offset" : 0, "end_offset" : 1, "type" : "CN_CHAR", "position" : 0 }, { "token" : "是", "start_offset" : 1, "end_offset" : 2, "type" : "CN_CHAR", "position" : 1 }, { "token" : "卡尔", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 2 }, { "token" : "码", "start_offset" : 4, "end_offset" : 5, "type" : "CN_CHAR", "position" : 3 }, { "token" : "农", "start_offset" : 5, "end_offset" : 6, "type" : "CN_CHAR", "position" : 4 } ] }

     还是有一点效果,其实搜索引擎分词很有讲究,现在我所了解的医疗行业的分词已经有公司通过机器学习病例样生成好用的字典给ik来使用,虽然上面"卡尔"被认为在一起,但是“码农”很明显也应该合并一下,这个我们都可以通过配置ik的字典来解决这个问题,当前不讨论这个问题了。

最后

   当初有接触过lucene、后来接触compass、再后来接触TB的终搜、solrj包括现在的ES,搜索引擎在各行业中都发挥这重要作用,后面我会提到ES在我们单位的使用实战情况。感谢您的关注!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这