为啥要使用
可以分词、全文搜索
安装方法
官方源
使用添加es官方安装源的方式 官方源安装ES步骤,
Docker版
这个目前最为省心,强烈推荐。
1 2 3 4 5 6 7
| FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2
# 安装ik分词插件,特别注意插件版本需要与ES的版本相匹配,否则会启动不了 RUN ./bin/elasticsearch-plugin install --batch https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
EXPOSE 9200 9300
|
导入数据
创建索引
ES6和ES5以及之前的版本有很大区别,下面的创建索引适用于ES6以上版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| curl --header "content-type: application/JSON" -XPUT 'http://localhost:9200/some_index' -d ' { "mappings": { "index_name": { "properties": { "id": { "type": "long"}, "desc": { "term_vector": "with_positions_offsets", "type": "text", "analyzer": "my_analyzer" }, "path": { "type": "text" } } } }, "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "filter": [ "lowercase" ], "char_filter": [ "html_strip", "escape_sign" ], "tokenizer": "ik_max_word" } }, "char_filter": { "escape_sign": { "type": "mapping", "mappings": [ "@=>lkjds3" ] } } } } }'
|
导入数据可以用这个第三方包:laravel-elasticsearch,配合写一个Command脚本就行了。
中文分词
手工编译源码
分词采用 IK Analysis for Elasticsearch,首先需要安装Java的打包工具mvn,然后clone上面github上面的代码,执行打包命令。
打包完成后会生成target目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ├── config │ └── ik ├── LICENSE.txt ├── pom.xml ├── README.md ├── src │ └── main └── target ├── archive-tmp ├── classes ├── elasticsearch-analysis-ik-1.8.0.jar ├── elasticsearch-analysis-ik-1.8.0-sources.jar ├── generated-sources ├── maven-archiver ├── releases └── surefire
11 directories, 5 files
|
官方编译版本
推荐这种方式 https://github.com/medcl/elasticsearch-analysis-ik/releases
安装
接着拷贝解压出target/releases/elasticsearch-analysis-ik-1.8.0.zip到ES根目录下的plugins目录(如果没有新建一个即可)下即可
本地的ArchLinux以及线上的CentOS均是位于如下目录
1
| /usr/share/elasticsearch
|
目录结构如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| plugins/ └── ik ├── commons-codec-1.9.jar ├── commons-logging-1.2.jar ├── config │ └── ik │ ├── custom │ │ ├── ext_stopword.dic │ │ ├── mydict.dic │ │ ├── single_word.dic │ │ ├── single_word_full.dic │ │ ├── single_word_low_freq.dic │ │ └── sougou.dic │ ├── IKAnalyzer.cfg.xml │ ├── main.dic │ ├── preposition.dic │ ├── quantifier.dic │ ├── stopword.dic │ ├── suffix.dic │ └── surname.dic ├── elasticsearch-analysis-ik-1.8.0.jar ├── elasticsearch-analysis-ik-1.8.0.zip ├── httpclient-4.4.1.jar ├── httpcore-4.4.1.jar └── plugin-descriptor.properties
4 directories, 20 files
|
需要注意的是plugins下的文件用户和组需要设置为:elasticsearch,否则会导致ES启动不了
1
| chown -R elasticsearch:elasticsearch plugins/
|
重启ES后就可以在对应的索引里头把analyzer修改成ik对应的几个分词器了
其他分词插件
有兴趣的老铁可以研究一下,目前IK对我来说是够了。
简繁转换
使用 STConvert Analysis for Elasticsearch 来进行繁体到简单的转换,代码clone下来后,使用mvn命令打包一下
打包成功后,可以在target/release目录内找到对应的包
1 2 3 4 5 6 7 8 9
| [INFO] Reading assembly descriptor: /home/vagrant/dev/elasticsearch-analysis-stconvert/src/main/assemblies/plugin.xml [INFO] Building zip: /home/vagrant/dev/elasticsearch-analysis-stconvert/target/releases/elasticsearch-analysis-stconvert-1.8.3.zip [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 12:06 min [INFO] Finished at: 2016-06-22T14:26:37+08:00 [INFO] Final Memory: 32M/212M [INFO] ------------------------------------------------------------------------
|
编辑插件包的时候千万注意版本问题,否则ES会报插件版本不符合的!
遇到的问题
query phase execution exception result window is too large
这个问题是因为默认窗口太小引起的,解决方式也很简单。
1
| curl -XPUT "http://localhost:9200/some_index/_settings" -d '{ "index" : { "max_result_window" : 100000 } }'
|
无法搜索@、!、.、等等特殊符号
这个问题是因为ES在建立索引的时候,会将这些字符视为无用字符。
一个比较土的方法,在索引的时候把@符号替换成某一串字符(一定不要是常用字符串)比如:uhbbgt,在检索的时候使用mapping把@符号再替换为uhbbgt即可。
参考文档