在 es 使用中,开发者想配置自身业务中沉淀的同义词(synonyms)表,并基于该同义词库配置包含其的分析器(analyzer),主要分为生成同义词文件、配置该同义词 filter 及包含其的分析器及使用解析器,三个步骤。
生成同义词文件
同义词内容通过人工整理、word2vector 等算法收集之后,整合到一个文件,每行配置相应的同义词对应表,每个词之间用英文逗号隔开,具体示例如下:
鼻头,鼻尖
鼻子,鼻部
耳朵,耳
二氧化碳,co2
减肥,瘦身
将如上同义词表保存为诸如 my_synonyms.txt 这样的文件,然后将其放置在 elasticsearch 安装文件目录的 config/analysis 相对目录下,笔者是这样的放置的。
配置同义词的 filter 及包含其的 analyzer
这里,首先要明确的是概念是,同义词表在 es 里面属于 analyzer 三个组成部分中的 token filter(其它 2 个是 character filter 和 tokenizer)。
那我们知道它们的关系之后,就明白应该先做同义词的 token filter 配置了,其后,将该 filter 包含在新定义的 analyzer 即可,这些都配置在 settings 下面,具体实例如下:
{
"my_index": {
"settings": {
"index": {
"analysis": {
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms_path": "analysis/my_synonyms.txt"
}
},
"analyzer": {
"ik_max_word_mysynonym": {
"filter": [
"mysynonym",
"standard",
"lowercase",
"stop"
],
"tokenizer": "ik_max_word"
},
"ik_smart_mysynonym": {
"filter": [
"mysynonym",
"standard",
"lowercase",
"stop"
],
"tokenizer": "ik_smart"
}
}
}
}
}
}
}
上面实例进一步解释的话,分词器 tokenizer 是使用的 es-ik 插件安装好的(ik_smart 和 ik_max_word),standard、lowercase、stop 是 es 内置的 token filter,自定义的同义词过滤器叫 my_synonym。
使用分析器
我们来到最后一步,如何使用已配置好的带有同义词的分析器,主要有两种方式,一个是在索引 mapping 里对应的字段里指定搜索和索引时的分析器,另一个是在搜索 query 里现指定分析器。
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"content": {
"type": "text",
"store": true,
"similarity": "BM25",
"analyzer": "ik_max_word_mysynonym",
"search_analyzer": "ik_smart_mysynonym"
},
...
}
}
}
}
}
上面例子给出了 index 里 content 字段对应的索引时的分析器是 ik_max_word_mysynonym
,搜索时的分析器是 ik_smart_mysynonym
。
如果想在查询时指定分析器,可以参考如下示例:
GET my_index/_search
{
"query": {
"multi_match": {
"query": "鼻头",
"fields": ["content"],
"analyzer": "ik_smart_mysynonym"
}
}
}