README.md 7.7 KB
Newer Older
weixin_43283383's avatar
weixin_43283383 已提交
1
IK Analysis for Elasticsearch
D
David Yun 已提交
2 3
=============================

weixin_43283383's avatar
weixin_43283383 已提交
4
The IK Analysis plugin integrates Lucene IK analyzer (http://code.google.com/p/ik-analyzer/) into elasticsearch, support customized dictionary.
D
David Yun 已提交
5

Z
zj0713001 已提交
6
Analyzer: `ik_smart` , `ik_max_word` , Tokenizer: `ik_smart` , `ik_max_word`
D
David Yun 已提交
7 8 9 10 11 12

Versions
--------

IK version | ES version
-----------|-----------
weixin_43283383's avatar
weixin_43283383 已提交
13
master | 6.x -> master
weixin_43283383's avatar
weixin_43283383 已提交
14
6.3.0| 6.3.0
Z
zj0713001 已提交
15
6.2.4| 6.2.4
M
muliuyun 已提交
16
6.1.3| 6.1.3
weixin_43283383's avatar
weixin_43283383 已提交
17
5.6.8| 5.6.8
weixin_43283383's avatar
weixin_43283383 已提交
18
5.5.3| 5.5.3
weixin_43283383's avatar
weixin_43283383 已提交
19
5.4.3| 5.4.3
weixin_43283383's avatar
weixin_43283383 已提交
20
5.3.3| 5.3.3
weixin_43283383's avatar
weixin_43283383 已提交
21
5.2.2| 5.2.2
weixin_43283383's avatar
weixin_43283383 已提交
22
5.1.2| 5.1.2
weixin_43283383's avatar
weixin_43283383 已提交
23
1.10.6 | 2.4.6
24
1.9.5 | 2.3.5
weixin_43283383's avatar
weixin_43283383 已提交
25
1.8.1 | 2.2.1
weixin_43283383's avatar
weixin_43283383 已提交
26
1.7.0 | 2.1.1
weixin_43283383's avatar
weixin_43283383 已提交
27
1.5.0 | 2.0.0
D
David Yun 已提交
28
1.2.6 | 1.0.0
weixin_43283383's avatar
weixin_43283383 已提交
29 30
1.2.5 | 0.90.x
1.1.3 | 0.20.x
D
David Yun 已提交
31 32 33 34 35
1.0.0 | 0.16.2 -> 0.19.0

Install
-------

weixin_43283383's avatar
weixin_43283383 已提交
36 37
1.download or compile

weixin_43283383's avatar
weixin_43283383 已提交
38
* optional 1 - download pre-build package from here: https://github.com/medcl/elasticsearch-analysis-ik/releases
Z
zj0713001 已提交
39

40 41 42
    create plugin folder `cd your-es-root/plugins/ && mkdir ik`
    
    unzip plugin to folder `your-es-root/plugins/ik`
weixin_43283383's avatar
weixin_43283383 已提交
43

weixin_43283383's avatar
weixin_43283383 已提交
44
* optional 2 - use elasticsearch-plugin to install ( supported from version v5.5.1 ):
S
shikui 已提交
45

weixin_43283383's avatar
weixin_43283383 已提交
46
    ```
weixin_43283383's avatar
weixin_43283383 已提交
47
    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
weixin_43283383's avatar
weixin_43283383 已提交
48 49 50
    ```

   NOTE: replace `6.2.3` to your own elasticsearch version
S
shikui 已提交
51

weixin_43283383's avatar
weixin_43283383 已提交
52
2.restart elasticsearch
S
shikui 已提交
53 54


D
David Yun 已提交
55 56 57

#### Quick Example

weixin_43283383's avatar
weixin_43283383 已提交
58
1.create a index
D
David Yun 已提交
59 60 61 62 63

```bash
curl -XPUT http://localhost:9200/index
```

weixin_43283383's avatar
weixin_43283383 已提交
64
2.create a mapping
D
David Yun 已提交
65 66

```bash
weixin_43283383's avatar
weixin_43283383 已提交
67
curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
D
David Yun 已提交
68 69 70
{
        "properties": {
            "content": {
weixin_43283383's avatar
weixin_43283383 已提交
71
                "type": "text",
weixin_43283383's avatar
weixin_43283383 已提交
72
                "analyzer": "ik_max_word",
weixin_43283383's avatar
weixin_43283383 已提交
73
                "search_analyzer": "ik_max_word"
D
David Yun 已提交
74 75
            }
        }
Z
zj0713001 已提交
76

D
David Yun 已提交
77 78 79
}'
```

weixin_43283383's avatar
weixin_43283383 已提交
80
3.index some docs
D
David Yun 已提交
81 82

```bash
weixin_43283383's avatar
weixin_43283383 已提交
83
curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d'
D
David Yun 已提交
84 85 86 87 88
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
```

```bash
weixin_43283383's avatar
weixin_43283383 已提交
89
curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d'
D
David Yun 已提交
90 91 92 93 94
{"content":"公安部:各地校车将享最高路权"}
'
```

```bash
weixin_43283383's avatar
weixin_43283383 已提交
95
curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d'
D
David Yun 已提交
96 97 98 99 100
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
```

```bash
weixin_43283383's avatar
weixin_43283383 已提交
101
curl -XPOST http://localhost:9200/index/fulltext/4 -H 'Content-Type:application/json' -d'
D
David Yun 已提交
102 103 104 105
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'
```

weixin_43283383's avatar
weixin_43283383 已提交
106
4.query with highlighting
D
David Yun 已提交
107 108

```bash
weixin_43283383's avatar
weixin_43283383 已提交
109
curl -XPOST http://localhost:9200/index/fulltext/_search  -H 'Content-Type:application/json' -d'
D
David Yun 已提交
110
{
weixin_43283383's avatar
weixin_43283383 已提交
111
    "query" : { "match" : { "content" : "中国" }},
D
David Yun 已提交
112 113 114 115 116 117 118 119 120 121 122
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
'
```

weixin_43283383's avatar
weixin_43283383 已提交
123
Result
D
David Yun 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

```json
{
    "took": 14,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 2,
        "hits": [
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "4",
                "_score": 2,
                "_source": {
                    "content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
                },
                "highlight": {
                    "content": [
                        "<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "3",
                "_score": 2,
                "_source": {
                    "content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
                },
                "highlight": {
                    "content": [
                        "均每天扣1艘<tag1>中国</tag1>渔船 "
                    ]
                }
            }
        ]
    }
}
```

### Dictionary Configuration

173 174
`IKAnalyzer.cfg.xml` can be located at `{conf}/analysis-ik/config/IKAnalyzer.cfg.xml`
or `{plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml`
D
David Yun 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
 	<!--用户可以在这里配置远程扩展字典 -->
	<entry key="remote_ext_dict">location</entry>
 	<!--用户可以在这里配置远程扩展停止词字典-->
weixin_43283383's avatar
weixin_43283383 已提交
188
	<entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
D
David Yun 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
</properties>
```

### 热更新 IK 分词使用方法

目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置

```xml
 	<!--用户可以在这里配置远程扩展字典 -->
	<entry key="remote_ext_dict">location</entry>
 	<!--用户可以在这里配置远程扩展停止词字典-->
	<entry key="remote_ext_stopwords">location</entry>
```

其中 `location` 是指一个 url,比如 `http://yoursite.com/getCustomDict`,该请求只需满足以下两点即可完成分词热更新。

S
shikui 已提交
205
1. 该 http 请求需要返回两个头部(header),一个是 `Last-Modified`,一个是 `ETag`,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
D
David Yun 已提交
206 207 208 209 210

2. 该 http 请求返回的内容格式是一行一个分词,换行符用 `\n` 即可。

满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

S
shikui 已提交
211 212
可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。

D
David Yun 已提交
213 214 215 216 217 218 219 220 221
have fun.

常见问题
-------

1.自定义词典为什么没有生效?

请确保你的扩展词典的文本格式为 UTF8 编码

weixin_43283383's avatar
weixin_43283383 已提交
222
2.如何手动安装?
D
David Yun 已提交
223 224 225 226 227


```bash
git clone https://github.com/medcl/elasticsearch-analysis-ik
cd elasticsearch-analysis-ik
H
Hsu Chen-Wei 已提交
228
git checkout tags/{version}
229
mvn clean
D
David Yun 已提交
230 231 232 233
mvn compile
mvn package
```

234 235 236 237 238
拷贝和解压release下的文件: #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录, 如: plugins/ik
重启elasticsearch

3.分词测试失败
请在某个索引下调用analyze接口测试,而不是直接调用analyze接口
weixin_43283383's avatar
weixin_43283383 已提交
239 240 241 242 243 244 245
如:
```bash
curl -XGET "http://localhost:9200/your_index/_analyze" -H 'Content-Type: application/json' -d'
{
   "text":"中华人民共和国MN","tokenizer": "my_ik"
}'
```
weixin_43283383's avatar
weixin_43283383 已提交
246

weixin_43283383's avatar
weixin_43283383 已提交
247

weixin_43283383's avatar
weixin_43283383 已提交
248 249 250 251 252 253 254
4. ik_max_word 和 ik_smart 什么区别?


ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

weixin_43283383's avatar
weixin_43283383 已提交
255 256
Changes
------
weixin_43283383's avatar
weixin_43283383 已提交
257 258
*5.0.0*

259
- 移除名为 `ik` 的analyzer和tokenizer,请分别使用 `ik_smart``ik_max_word`
weixin_43283383's avatar
weixin_43283383 已提交
260

weixin_43283383's avatar
weixin_43283383 已提交
261

D
David Yun 已提交
262 263 264 265 266 267 268
Thanks
------
YourKit supports IK Analysis for ElasticSearch project with its full-featured Java Profiler.
YourKit, LLC is the creator of innovative and intelligent tools for profiling
Java and .NET applications. Take a look at YourKit's leading software products:
<a href="http://www.yourkit.com/java/profiler/index.jsp">YourKit Java Profiler</a> and
<a href="http://www.yourkit.com/.net/profiler/index.jsp">YourKit .NET Profiler</a>.