elasticsearch集成分词器

42 阅读2分钟

1、背景

区别于系统日志的检索,尝试了下一些C端的商品搜索功能,基本围绕ik+pinyin的分词模式进行的搜索,这里也尝试下简单的搭建配置去了解学习下如何配置支持拼音和中文检索。

2、安装ik、拼音分词器

以我docker部署为例子

# 进入容器内
docker exec -it elasticsearch bash 

#下载pinyin,注意这里的版本号要和elasticsearch的版本一致,如elasticsearch为7.12.22,则最后改为/7.12.22
./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-pinyin/8.4.1

#下载ik
./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.4.1

docker restart elasticsearch

3、配置分词器规则

ik分词器github文档中介绍只有两种模式分为ik_smart和ik_max_word。

ik_max_word:对文本进行最细粒度的分割。例如,它会将“中华人民共和国国歌”切分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,穷举生成各种可能的组合,适合Term Query。

ik_smart:对文本进行最粗粒度的分割。例如将“中华人民共和国国歌”分词为“中华人民共和国,国歌”,适合短语查询。

测试开始

先创建了一个索引,名称为shop,数据如下

image.png

curl --location --request PUT '127.0.0.1:9200/shop' \
--header 'Content-Type: application/json' \
--data '{
  "settings": {
    "analysis": {
      "tokenizer": {  
        "ik_max_word_tokenizer": {
          "type": "ik_max_word"
        }
      },
      "analyzer": {  
        "pinyin_ik_analyzer": {
          "type": "custom",
          "tokenizer": "ik_max_word_tokenizer",
          "filter": ["pinyin_filter"]
        }
      },
      "filter": {  
        "pinyin_filter": {
          "type": "pinyin",
          "keep_separate_first_letter": false,
          "keep_full_pinyin": true,
          "keep_original": true,
          "keep_joined_full_pinyin":true,
          "lowercase": true
        }
      }
    }
  },
  "mappings": {
     "properties": {
        "createdTime": {
          "type": "date"
        },
        "fullName": {
          "type": "text",
          "analyzer": "pinyin_ik_analyzer", 
          "search_analyzer": "ik_smart",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }

        },
        "id": {
          "type": "long"
        },
        "modifyTime": {
          "type": "date"
        },
        "position": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "type": {
          "type": "long"
        }
      }
  }
}'

image.png

测试下来,其实这个配置主要还是看所需场景进行控制,一般还会加入自定义词典,这里只是简单的整合ik和pinyin就不过多篇幅了,围绕上面的json配置自定义分词器其实主要三个部分,tokenizer配置用来处理搜索文本的分词规则,filter在分词器tokenizer生成词汇后对这些词汇进行进一步的处理,最后再由analyzer按照配置的顺序依次应用其中的tokenizer和filter。

相关plugin配置文档

pinyin : github.com/infinilabs/…

ik: github.com/infinilabs/…