本文由 简悦 SimpRead 转码, 原文地址 www.junphy.com
搜索引擎一般都由 [分词器——tokenizer、token 过滤器——token filter]——analyzer 组成:
Elasticsearch 中的 tokenizers:
Standard Tokenizer、 Whitespace Tokenizer、Letter Tokenizer 等。以 Letter Tokenizer 为例:The letter
tokenizer divides text into terms whenever it encounters a character which is not a letter.
Input => “quick 2 brown’s fox “
Output => [quick,brown,s,fox]
更多信息参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html
Token Filters
token filter 作用在由 tokenizer 产生的 token 上,并根据对应的规则修改 token。常见的 token filter 包括:Stop token filter、Synonym token filter 等。后面会详细介绍 Synonym token filter
更多信息参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html
自定义 Analyzer
指定可用的 tokenizer 和 token filter:
{
"analysis": {
"filter": {
"synonym_word_filter": {
"type": "synonym",
"updateable": "true",
"expand": "false",
"synonyms_path": "analysis/synonym.txt"
}
},
"analyzer": {
"ik_smart_synonym": { // analyzer名称
"filter": [
"synonym_word_filter" //指定filter
],
"type": "custom",
"tokenizer": "ik_smart" // 指定tokenizer,使用的是IK分词器的tokenizer
}
}
}
}
IK 分词器适用于中文分词的 Elasticsearch 插件,安装方式在 repo 里描述了。下面介绍如何在 Elasticsearch 7.11 版本使用同义词以及配置远程扩展词库。
配置同义词
- 创建索引时创建自己的 analyzer
- mapping 时指定 search_analyzer
- 创建同义词文件
步骤 1 的索引可使用上述的自定义 analyzer;
mapping 时,一般指定 search_analyzer 使用自定义同义词 analyzer,在数据存入 Elasticsearch 创建索引时,一般使用标准的 ik_smart 或者 ik_max_word。一个案例如下:
{
"properties": {
"question": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": " ik_smart_synonym", //上一步索引时创建的自定义 analyzer
"index": "true"
},
"answer": {
"type": "text",
"index": "false"
},
"questionId": {
"type": "integer"
}
}
}
同义词文件配置:
我是使用 dpkg 命令在 Ubuntu 安装的, synonym.txt 文件配置放在安装路径:/etc/elasticsearch/analysis/synonym.txt 下,你也可使用 whereis elasticsearch
查看你的安装目录,analysis 目录需要自行创建。 synonym.txt 文件格式如下:
土豆, 马铃薯, potato
香蕉, banana
注意到 synonym_word_filter
中设置了 expand
为 false
。以上述同义词为例,如果设置 expand
为 false
, 则只会将 token 中的 “马铃薯”、“potato”、“土豆” 替换成“土豆”,即以第一个词为准。如果 expand
为 true
,则如果 token 中出现 “土豆”,“马铃薯”,“potato” 任一词,都会解析成三个 token。 如果不设置此项,则默认 expand
为 true
expand: false
expand: true
由于在创建索引时使用了 "updateable": "true"
配置,你可以在修改了 synonym.txtx 之后调用 API: [POST /my-index/_reload_search_analyzers](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html)
更新 search_analyzer 的配置。
配置远程扩展词库
在 IK 分词配置下的 IKAnalyzer.cfg.xml 文件中配置远程接口或者文件 URI。接口使用 GET 访问方式,接口的返回 Header 里在远程词库变化时更改 Last-Modified
或者 ETag
字段即可热更新。