入门教程-ElasticSearch5.6.1 + IK中文分词实现

技术分享 2018年09月19日 阅读 617 豆浆大叔

前言:

Elasticsearch简写es,Elasticsearch是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。

搜索引擎中的强者:

Elasticsearch是一个分布式的搜索引擎和数据分析引擎,支持全文检索,结构化检索,数据分析,可以对海量数据进行近实时的处理;可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司。对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。

下面开始安装:
Elasticsearch(下面称为ES)是一个基于Lucene的搜索服务器(By 百度百科:查看)。所以他需要java的环境即jdk,所以需要
先安装java环境。

Java环境安装

Java -version 查看虚拟机是否安装了java环境。


从上面看我的虚拟机是没有安装过的(实际上为了试验效果把之前安装的卸载了)。

  • 首先需要查看yum源里面是否有java jdk
yum list |grep java |grep jdk

下面是yum源中全部的jdk没有截图截完。


大家可以看到 上面提示看出,这个提醒我们yum源数据超过2周是旧的,需要请缓存更新。
我们照做:yum makecache fast 此步操作可以省略,更新很浪费时间。

我这里更新时,连接失败,虚拟机开启代理导致的关闭即可。Vim /etc/yum.conf

  • 下面就yum 安装java了
yum install -y java-1.8.0-openjdk

需要设置网络,安装过程中会更新yum源

[root@test ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

ElasticSearch安装

1.下载tar包安装

Elasticsearch的安装很简单,下载下来解压即可,这里使用wget下载,当然也可通过网页下载 https://www.elastic.co/downloads/elasticsearch ,再拷贝。

2.点击Downloads

选择past releases

3.点击下载:

4.右键点击RPM选择 -- 复制连接地址

它的地址:MACOS/LINUX sha

5.下载:

Elasticsearch安装包

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz

[root@test ~]# tar -zxvf elasticsearch-6.4.0.tar.gz  -C /usr/local/
6.运行Elasticsearch

Elasticsearch 要求不能使用超级用户root运行,所以我们建立一个test账号

# 创建test账户 
adduser test
# 修改密码 
passwd test

然后,给test用户elasticsearch目录的授权。

chown -R testuser:testuser /usr/local/elasticsearch-6.4.0/

#补充下:(chown改变文件拥有者)
使用权限 : root 
使用方式 : chown [-cfhvR] [–help] [–version] user[:group] file… 
必要参数: 
-c 显示更改的部分的信息 
-f 忽略错误信息 
-h 修复符号链接 
-R 处理指定目录以及其子目录下的所有文件 
-v 显示详细的处理信息 
-deference 作用于符号链接的指向,而不是链接文件本身 
例子: 
改变拥有者和群组 
chown test:test test.txt 
改变文件拥有者和群组 
chown root: test.txt 
改变文件群组 
chown :test test.txt

虚拟机已存在test用户,这里改成了testuser密码同样是testuser.

切换至elasticsearch目录,并以testuser用户运行

cd  /usr/local/elasticsearch-6.4.0/
su testuser //切换到testuser用户
[root@test ~]# cd /usr/local/elasticsearch-6.4.0/

[testuser@test elasticsearch-6.4.0]$ ./bin/elasticsearch


[2018-09-19T09:02:36,614][INFO ][o.e.n.Node               ] [] initializing ...
[2018-09-19T09:02:36,669][INFO ][o.e.e.NodeEnvironment    ] [5W3tO9E] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [46.6gb], net total_space [49.9gb], types [rootfs]
[2018-09-19T09:02:36,669][INFO ][o.e.e.NodeEnvironment    ] [5W3tO9E] heap size [990.7mb], compressed ordinary object pointers [true]
[2018-09-19T09:02:36,671][INFO ][o.e.n.Node               ] [5W3tO9E] node name derived from node ID [5W3tO9EhQ4S13hUx2QxKVA]; set [node.name] to override
[2018-09-19T09:02:36,671][INFO ][o.e.n.Node               ] [5W3tO9E] version[6.4.0], pid[3864], build[default/tar/595516e/2018-08-17T23:18:47.308994Z], OS[Linux/3.10.0-693.21.1.el7.x86_64/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/1.8.0_181/25.181-b13]
[2018-09-19T09:02:36,671][INFO ][o.e.n.Node               ] [5W3tO9E] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.t1Lr8WBf, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/usr/local/elasticsearch-6.4.0, -Des.path.conf=/usr/local/elasticsearch-6.4.0/config, -Des.distribution.flavor=default, -Des.distribution.type=tar]
[2018-09-19T09:02:38,946][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [aggs-matrix-stats]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [analysis-common]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [ingest-common]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [lang-expression]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [lang-mustache]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [lang-painless]
[2018-09-19T09:02:38,947][INFO ][o.e.p.PluginsService     ] [5W3tO9E] loaded module [mapper-extras]
....................................
启动失败!
[2018-09-19T09:02:55,658][WARN ][o.e.b.BootstrapChecks    ] [5W3tO9E] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

上面报了一个错误:
一个指的是:max_map_count 的值是指一个进程最多可用于的内存映射区(memory map areas),在调用malloc会用到,由mmap/mprotect生成。
一个指的是:文件描述符太低
解决办法:官方文档介绍有两个方案 
切换到root用户修改配置/etc/sysctl.conf/etc/security/limits.conf

su root vim /etc/sysctl.conf
在/etc/sysctl.conf最后加入 
vm.max_map_count=262144
在 /etc/security/limits.conf最后加入
* soft nofile 65536 
* hard nofile 131072 
* soft nproc 2048 
* hard nproc 4096

#流程
[testuser@test elasticsearch-6.4.0]$ su root
Password: 
[root@test elasticsearch-6.4.0]# vim /etc/sysctl.conf 
[root@test elasticsearch-6.4.0]# sysctl -p
vm.max_map_count = 262144
[root@test elasticsearch-6.4.0]# vim /etc/security/limits.conf 

切换回testuser用户:

[root@test elasticsearch-6.4.0]# su testuser
[testuser@test elasticsearch-6.4.0]$ ./bin/elasticsearch

如果想后台运行 ./bin/elasticseard -d
访问curl 'http://localhost:9200'

{
  "name" : "5W3tO9E",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "SwLHbzxIR0KLu5zZ64F7LA",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

配置elasticsearch指定ip地址访问:
vim ./config/elasticsearch.yml

修改IP外网浏览器访问:http://192.168.153.128:9200发现启动不了报错了,然后排除是不是防火墙的问题,但是虚拟机的防火墙都是关闭的。

发现报的异常错误: IllegalStateException

Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elasticsearch-6.4.0/data/elasticsearch]] with lock id [0]; maybe these locations are not writable or multiple nodes were started in withoutcreasing [node.max_local_storage_nodes] (was [1])?

解决办法已经告诉我们了,删除 安装目录下/data

cd  /usr/local/elasticsearch-6.4.0/data/elasticsearch/data
rm -rf nodes

删除完毕以后查看端口占用情况:

netstat -nltp
tcp6       0      0 :::3306                 :::*                    LISTEN      1143/mysqld         
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      4235/java           
tcp6       0      0 ::1:9200                :::*                    LISTEN      4235/java           
tcp6       0      0 :::9201                 :::*                    LISTEN      4901/java           
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      4235/java           
tcp6       0      0 ::1:9300                :::*                    LISTEN      4235/java           
tcp6       0      0 :::9301                 :::*                    LISTEN      4901/java  

可以看到现在端口变成了9201了,不是9200端口了(这里有点怪异 正常都是9200端口,暂时先不用管)

浏览器再次访问:http://192.168.153.128:9201

使用elasticsearch官方默认的分词插件:

curl -H "Content-Type:application/json" -XGET 'http://localhost:9200/_analyze?pretty=true' -d '{"text":"我只是测试下官方提供的分词插件"}'

分词结果是:

[testuser@test elasticsearch-6.4.0]$ curl -H "Content-Type:application/json" -XGET 'http://localhost:9200/_analyze?pretty=true' -d '{"text":"我只是测试下官方提供的分词插件"}'
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "只",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "是",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "测",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "试",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "下",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    },
    {
      "token" : "官",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "<IDEOGRAPHIC>",
      "position" : 6
    },
    {
      "token" : "方",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "<IDEOGRAPHIC>",
      "position" : 7
    },
    {
      "token" : "提",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "<IDEOGRAPHIC>",
      "position" : 8
    },
    {
      "token" : "供",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "<IDEOGRAPHIC>",
      "position" : 9
    },
    {
      "token" : "的",
      "start_offset" : 10,
      "end_offset" : 11,
      "type" : "<IDEOGRAPHIC>",
      "position" : 10
    },
    {
      "token" : "分",
      "start_offset" : 11,
      "end_offset" : 12,
      "type" : "<IDEOGRAPHIC>",
      "position" : 11
    },
    {
      "token" : "词",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "<IDEOGRAPHIC>",
      "position" : 12
    },
    {
      "token" : "插",
      "start_offset" : 13,
      "end_offset" : 14,
      "type" : "<IDEOGRAPHIC>",
      "position" : 13
    },
    {
      "token" : "件",
      "start_offset" : 14,
      "end_offset" : 15,
      "type" : "<IDEOGRAPHIC>",
      "position" : 14
    }
  ]
}
从结果可以看到:
Elasticsearch在处理中文内容的搜索时,中文分词被拆分成一个个的汉字,如果使用Kibana作图的时候,会按照terml来分组,又会把一个个的汉子分成一组。官方解释说是,Elasticsearch默认的标准分词器会把中文词语一个个切分成汉字。

安装中文分词插件elasticsearch-analyzer-ik

下载链接:
elasticsearch-analyzer-ik插件
两种安装方法:
第一种:下载解压

下载构建包:https://github.com/medcl/elasticsearch-analysis-ik/releases
创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
将插件解压缩到文件夹 your-es-root/plugins/ik

第二种:

  • 使用elasticsearch-plugin进行安装(从v5.5.1版本支持): 注意版本号对应
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip

这里快速安装了,选择第二种方案了:

然后启动时会报错:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
由于elasticsearch6.4默认分配jvm空间大小为2g,修改jvm空间分配

# vim /usr/local/elasticsearch-6.4.0/config/jvm.options  
-Xms1g  
-Xmx1g  
修改为下面:512M
    -Xms512m  
    -Xmx512m
修改ik的配置:/usr/local/elasticsearch-6.4.0/config/elasticsearch.yml 
index.analysis.analyzer.default.tokenizer : "ik_max_word"
index.analysis.analyzer.default.type: "ik"

最后运行es,看看分词结果:

curl -H "Content-Type:application/json" -XGET 'http://localhost:9201/_analyze?&pretty' -d '{"analyzer":"ik_max_word","text":"我们是蜗牛巢忠实爱好者"}'
{
  "tokens" : [
    {
      "token" : "我们",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "蜗牛巢",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "忠实",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "爱好者",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 4
    }
  ]
}

到这里就实现了 中文分词,比es自带的要很好多,我们可以更精准的将中文词语分开。

下一章会将一下Elasticsearch的可视化工具和如果将Elasticsearch跟PHP项目结合起来,包括日志的处理等等,有兴趣的话,静请期待!

豆浆大叔 豆浆大叔 资深PHP工程师@某一线大厂

写了 264486 字,被 3 人关注,共写了 75 篇笔记

(已更名,豆浆大叔)有理想的码农,不应该只探究人性的懒惰面,而是积极的去探索人生道路上的荆棘坎坷,努力提升自己完善自己!
推荐文章:
  • 大数据领域Flink 与 Spark之间的区别?

    学而不思则罔 思而不学则殆,2020年砥砺前行!前言大家都知道已经2020年了,也到了新的一年。作为一个主营电商的公司,年底都会很忙。所以最近的更新进度也停滞不前,本来准备大侃PHP设计模式的,但是因...

    豆浆大叔 21天前 3 吐槽 81 围观 技术分享
  • php如何实现钩子与实践案例

    前言学而不思则罔,思而不学则殆。30则而立,头顶正则脱光!昨天晚上,突然想起了PHP中的钩子如何使用?说实话,像dz,wordpress,TP,CI框架都已经集成了Hook钩子,尽管我不怎么使用框架以...

    豆浆大叔 1个月前 0 吐槽 43 围观 技术分享
  • Linux无法显示ip地址的解决办法

    今天想趁着有时间,用虚拟机调试一下lua脚本和其他的功能,结果启动虚拟机使用xshell连接不上,然后使用终端查看IP地址无法查看到,记录一下排查错误流程。查看IP地址使用ip addr 或者 ifc...

    豆浆大叔 1个月前 0 吐槽 89 围观 技术分享
  • 高并发性能指标QPS,TPS,RT,并发数,吞吐量是指什么?

    QPS,每秒查询QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系...

    豆浆大叔 1个月前 0 吐槽 177 围观 技术分享
  • 分享一些PHP常用的小算法

    下面分享一些最常见的算法,用PHP如何实现,拓展下知识面。冒泡排序function bubble_sort($arr) { $n=count($arr); for($i=0;$i<$n-1;$...

    我也庸俗 2个月前 0 吐槽 86 围观 技术分享
表情
  • [:821l1001:]
  • [:821l1002:]
  • [:821l1003:]
  • [:821l1004:]
  • [:821l1005:]
  • [:821l1006:]
  • [:821l1007:]
  • [:821l1008:]
  • [:821l1009:]
  • [:821l1010:]
  • [:821l1011:]
  • [:821l1012:]
  • [:821l1013:]
  • [:821l1014:]
  • [:821l1015:]
  • [:821l1016:]
  • [:821l1017:]
  • [:821l1018:]
  • [:821l1019:]
  • [:821l1020:]
  • [:821l1021:]
  • [:821l1022:]
  • [:821l1023:]
  • [:821l1024:]
  • [:821l1025:]
  • [:821l1026:]
  • [:821l1027:]
  • [:821l1028:]
  • [:821l1029:]
  • [:821l1030:]
  • [:821l1031:]
  • [:821l1032:]
  • [:821l1033:]
  • [:821l1034:]
  • [:821l1035:]
  • [:821l1036:]
  • [:821l1037:]
  • [:821l1038:]
  • [:821l1039:]
  • [:821l1040:]
  • [:821l1041:]
  • [:821l1042:]
  • [:821l1043:]
  • [:821l1044:]
  • [:821l1045:]
  • [:821l1046:]
  • [:821l1047:]
  • [:821l1048:]
  • [:821l1049:]
  • [:anger:]
  • [:applause:]
  • [:awkward:]
  • [:brokenheart:]
  • [:clown:]
  • [:confused:]
  • [:decline:]
  • [:diggingmouth:]
  • [:eyebrows:]
  • [:grinning:]
  • [:haha:]
  • [:ill:]
  • [:kiss:]
  • [:lascivious:]
  • [:laugh:]
  • [:love:]
  • [:lovely:]
  • [:rhinorrhea:]
  • [:smile:]
  • [:solid:]
  • [:strong:]
  • [:sweat:]
  • [:tearcollapse:]
  • [:tongue:]
  • [:uncomfortable:]
  • [:weak:]
  • [:worry:]
Tips:支持Markdown语法

0 个评论

抢座沙发~~~~
资深PHP工程师 @ 某一线大厂

登录

第三方账号登录:
GitHub
微信
微博