悟空,拿我的打狗棒来

es的同义词filter在analyzer中是如何工作的?

Elasticsearch | 作者 caryliang | 发布于2022年09月20日 | 阅读数:1025

配置单项同义词:  我好二呀=>我好饿呀。analyzer是基本的standard的分词+synonym的token filter。
_analyze分析文本
{
  "analyzer": "analyzer_synonym",
  "text": "我好二呀"
}
结果:
{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 4,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "好",
            "start_offset": 0,
            "end_offset": 4,
            "type": "SYNONYM",
            "position": 1
        },
        {
            "token": "饿",
            "start_offset": 0,
            "end_offset": 4,
            "type": "SYNONYM",
            "position": 2
        },
        {
            "token": "呀",
            "start_offset": 0,
            "end_offset": 4,
            "type": "SYNONYM",
            "position": 3
        }
    ]
}
问:经过standard分词器后,被分成一个一个字“我”“好”“二”“呀”,然后同义词是怎么工作的?我看同义词配置是完整的词"我好二呀",怎么能对应standard分词后的一个一个字呢?

 
已邀请:

Ombres

赞同来自:

synonym 在词典解析的时候,会按照你定义的分词器的配置,重新走一遍分词流程。
 
我好二呀=>我好饿呀
这个配置对应的规则应该是
“我”“好”“二”“呀”  => “我”“好”“饿”“呀”
依照这个规则 去你的tokenstream中有序匹配相关的token,然后判断是否为同义词
 
按我的理解,他这么实现的原因应该是为了支持词组的同义词,因为有些场景是需要将多个token映射为更少token的
 
常规情况,少词对多词的话,词的start_offset end_offset 会递增处理。
 

要回复问题请先登录注册