Elasticsearch 同义词通过专有的同义词过滤器(synonym token filter)来进行工作,它允许在分析(analysis)过程中方便地处理同义词,一般是通过配置文件配置同义词。此外,同义词可以再建索引时或者检索时使用。
配置示例
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_synonym_analyser": {
"tokenizer": "whitespace",
"filter": [ "my_synonym" ]
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
}
同义词(synonym)配置语法
如上例子所示,es 同义词配置的 filter 语法具体如下选项:
type
:指定 synonym,表示同义词 filter;synonyms_path
:指定同义词配置文件路径;expand
:该参数决定映射行为的模式,默认为 true,表示扩展模式,具体示例如下:- 当
expand == true
时,ipod, i-pod, i pod
ipod, i-pod, i pod => ipod, i-pod, i pod
当
expand == false
时,ipod, i-pod, i pod
仅映射第一个单词,等价于:
ipod, i-pod, i pod => ipod
- 当
lenient
:如果值为 true 时,遇到那些无法解析的同义词规则时,忽略异常。默认为 false。
同义词文档格式
elasticsearch 的同义词有如下两种形式:
- 单向同义词:
ipod, i-pod, i pod => ipod
- 双向同义词:
马铃薯, 土豆, potato
单向同义词不管索引还是检索时,箭头左侧的词都会映射成箭头右侧的词;
双向同义词是索引时,都建立同义词的倒排索引,检索时,同义词之间都会进行倒排索引的匹配。
同义词的文档化时,需要注意的是,同一个词在不同的同义词关系中出现时,其它同义词之间不具有传递性,这点需要注意。
假设如上示例中,如果“马铃薯”和其它两个同义词分成两行写:
马铃薯,土豆
马铃薯,potato
此时,elasticsearch 中不会将“土豆”和“potato”视为同义词关系,所以多个同义词要写在一起,这往往是开发中经常容易疏忽的点。