analysis-ik README

The project's README from github.com/infinilabs/analysis-ik. As one markdown file: README.md.

IK Analysis for Elasticsearch and OpenSearch

Test License

The IK Analysis plugin integrates Lucene IK analyzer, and support customized dictionary. It supports major versions of Elasticsearch and OpenSearch. Maintained and supported with ❤️ by INFINI Labs.

The plugin comprises analyzer: ik_smart , ik_max_word, and tokenizer: ik_smart , ik_max_word

How to Install

🚀 Get the Packaged Plugins

You can download the packaged plugins from here:

https://release.infinilabs.com/


🛠️ Install via CLI

Alternatively, you can use the plugin CLI to install the plugin. Here's how:

For Elasticsearch:

bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/9.1.4

For OpenSearch:

bin/opensearch-plugin install https://get.infini.cloud/opensearch/analysis-ik/2.12.0

⚠️ Tip

Make sure to replace the version number with the one that matches your Elasticsearch or OpenSearch version.

Getting Started

1.create a index

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

2.create a mapping

curl -XPOST http://localhost:9200/index/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }

}'

3.index some docs

curl -XPOST http://localhost:9200/index/_create/1 -H 'Content-Type:application/json' -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
curl -XPOST http://localhost:9200/index/_create/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校车将享最高路权"}
'
curl -XPOST http://localhost:9200/index/_create/3 -H 'Content-Type:application/json' -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
curl -XPOST http://localhost:9200/index/_create/4 -H 'Content-Type:application/json' -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'

4.query with highlighting

curl -XPOST http://localhost:9200/index/_search  -H 'Content-Type:application/json' -d'
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
'

Result

{
    "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

Config file IKAnalyzer.cfg.xml can be located at {conf}/analysis-ik/IKAnalyzer.cfg.xml or {plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<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>
	<entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>

Hot-reload Dictionary

The current plugin supports hot reloading dictionary for IK Analysis, through the configuration mentioned earlier in the IK configuration file.

	<entry key="remote_ext_dict">location</entry>
	<entry key="remote_ext_stopwords">location</entry>

Among which location refers to a URL, such as http://yoursite.com/getCustomDict. This request only needs to meet the following two points to complete the segmentation hot update.

  1. The HTTP request needs to return two headers, one is Last-Modified, and the other is ETag. Both of these are of string type, and if either changes, the plugin will fetch new segmentation to update the word library.

  2. The content format returned by the HTTP request is one word per line, and the newline character is represented by \n.

Meeting the above two requirements can achieve hot word updates without the need to restart the ES instance.

You can place the hot words that need to be automatically updated in a .txt file encoded in UTF-8. Place it under nginx or another simple HTTP server. When the .txt file is modified, the HTTP server will automatically return the corresponding Last-Modified and ETag when the client requests the file. You can also create a separate tool to extract relevant vocabulary from the business system and update this .txt file.

FAQs


  1. Why isn't the custom dictionary taking effect?

Please ensure that the text format of your custom dictionary is UTF8 encoded.

  1. What is the difference between ik_max_word and ik_smart?

ik_max_word: Performs the finest-grained segmentation of the text. For example, it will segment "中华人民共和国国歌" into "中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌", exhaustively generating various possible combinations, suitable for Term Query.

ik_smart: Performs the coarsest-grained segmentation of the text. For example, it will segment "中华人民共和国国歌" into "中华人民共和国,国歌", suitable for Phrase queries.

Note: ik_smart is not a subset of ik_max_word.

Community

Fell free to join the Discord server to discuss anything around this project:

https://discord.gg/4tKTMkkvVX

License

Copyright ©️ INFINI Labs.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

analysis-ik (infinilabs/analysis-ik)

Searching Database…

这是做什么用的?这是一个用于 Elasticsearch 和 OpenSearch 的插件,集成了 Lucene 的 IK 分词器,提供中文分词功能,并支持自定义词典。
它是一个独立的搜索引擎,还是要安装到搜索引擎里的东西?它不是独立的 —— 它是安装到你的 Elasticsearch 或 OpenSearch 集群里的插件,会添加两个分析器/分词器:ik_max_word 和 ik_smart,你在索引 mapping 里选用即可。
怎么把它安装到我的集群里?在 releases 页面下载与集群版本匹配的插件安装包,或者通过插件 CLI(elasticsearch-plugin install / opensearch-plugin install)指向对应版本的 release zip 进行安装。
它支持哪些版本的 Elasticsearch 和 OpenSearch?两者的大版本都支持,但安装的插件构建版本必须与集群的版本号完全一致。
添加自定义词典时,大家容易在什么地方踩坑?词典文件必须是 UTF-8 编码,否则不会生效;另外热更新的远程词源必须返回 Last-Modified 和 ETag 响应头,插件才能获取更新。
它是运行在我的电脑上,还是运行在搜索集群里?运行在集群里 —— 只要 Elasticsearch 或 OpenSearch 能跑的地方它就能用,通常是自托管的 Linux 服务器或 Docker 部署。
ik_max_word 和 ik_smart 有什么区别?ik_max_word 会做最细粒度的切分,穷尽生成所有可能的词组合 —— 适合 Term Query。ik_smart 会做最粗粒度的切分,适合短语查询;它并不是 ik_max_word 的子集。
能不能不重启集群就更新词库?可以 —— 支持热更新。在 IKAnalyzer.cfg.xml 里把某个 location URL 指向一个 UTF-8 编码的词表(每行一个词,比如由 nginx 提供的 .txt 文件);当它的 Last-Modified 或 ETag 变化时,插件会自动拉取新词。
Creator
infinilabs
Size
15.2 MB
Stars
17.5K
Age
14y
Commits · 90 Days