ES文档的数据拆分成一个个有完整含义的关键词,并将关键词与文档对应,这样就可以通过关键词查询文档。要想正确的分词,需要选择合适的分词器
GET /_analyze
{
"analyzer":"分词器",
"text":"被分词的文本"
}
POST /<index>/_analyze
{
"field":"字段名",
"text":"被分词的文本"
}
POST /_analyze
{
"tokenizer":"分词器",
"filter":"Token Filter",
"char_filter":"",
"text":"被分词的文本"
}
# 指定索引的默认分析器
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
}
}
}
}
}
# 指定字段的分析器
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
# 查询时指定分析器
GET my_index/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
# 指定字段的搜索(search time)分析器
# 如果指定搜索分析器则必须指定索引分析器
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
# 指定索引的默认分析器与搜索的默认分析器
# 如果提供了搜索分析器则必须指定默认的索引分析器
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}
可以在创建索引库的时候,通过/settings来配置自定义的analyzer(分词器)
PUT /<index>
{
"settings":{
"analysis":{
"analyzer":{ // 自定义分词器
"my_analyzer":{ // 自定义分词器名称
"tokenizer":"ik_max_word",
"filter":"pinyin"
}
}
}
}
}
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer":{
"type":"custom",
"char_filter":["emoticons"],
"tokenizer":"punctuation",
"filter":["lowercase","english_stop"]
}
},
"tokenizer": {
"punctuation":{
"type":"pattern",
"pattern":[".",",","!","?"]
}
},
"char_filter": {
"emoticons":{
"type":"mapping",
"mappings":[":) => _happy_",":( => _sad_"]
}
},
"filter": {
"english_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
}
}
POST /my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text":" I'm a :) person, and you? "
}
因为内置分词器不支持中文,可以看以下默认分词器对中文的效果展示
ik分词器github地址:https://github.com/medcl/elasticsearch-analysis-ik/
IK版本 | ES版本 |
---|---|
master | 7.x -> master |
6.x | 6.x |
5.x | 5.x |
1.10.6 | 2.4.6 |
1.9.5 | 2.3.5 |
1.8.1 | 2.2.1 |
1.7.0 | 2.1.1 |
1.5.0 | 2.0.0 |
1.2.6 | 1.0.0 |
1.2.5 | 0.90.x |
1.1.3 | 0.20.x |
1.0.0 | 0.16.2 -> 0.19.0 |
进入该网址https://github.com/medcl/elasticsearch-analysis-ik/releases
#注意,请将版本替换为自己所需要的版本
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.1/elasticsearch-analysis-ik-7.7.1.zip
# 其他命令扩展
# 查看已安装插件
elasticsearch‐plugin list
# 安装插件
elasticsearch‐plugin install analysis‐icu
# 删除插件
elasticsearch‐plugin remove analysis‐icu
IK分词器根据词典进行分词,词典文件在lK分词器的config目录中
因为ik分词器只识别默认的一些词语,有一些自造词无法识别例如‘骚年,极客时间,朋友圈’
#注意xxx.dic要与自己建立dic文件名一致
<?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">xxx.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
十多年
李白
传智慧
要实现根据字母做补全,就必须对文档按照拼音分词
拼音分词器官网:https://github.com/medcl/elasticsearch-analysis-pinyin
POST /_analyze
{
"text":"如家酒店还不错",
"analyzer":"pinyin"
}
拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用,因为如果用户输入的是中文也会分词为拼音去匹配就会造成一些没用的文档,只希望输入中文就用中文查,用了拼音才用拼音分词器