英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/synonyms-analysis-chain.html
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
同义词和分析链 (Synonyms and The Analysis Chain)edit
在 同义词格式 一章中,我们使用 u s a
来举例阐述一些同义词相关的知识。那么为什么
我们使用的不是 U.S.A.
呢?原因是, 这个 同义词
的语汇单元过滤器(token filter)只能接收到在它前面的语汇单元过滤器或者分词器(tokenizer)的输出结果。
假设我们有一个分析器,它由 standard
分词器、 lowercase
的语汇单元过滤器、 synonym
的语汇单元过滤器组成。文本 U.S.A.
的分析过程,看起来像这样的:
original string(原始文本) → "U.S.A." standard tokenizer(分词器) → (U),(S),(A) lowercase token filter(语汇单元过滤器) → (u),(s),(a) synonym token filter(语汇单元过滤器) → (usa)
如果我们有指定的同义词 U.S.A.
,它永远不会匹配任何东西。因为, my_synonym_filter
(注: 一个自定义的过滤器) 看到词项的时候,句号(英文的点)已经被移除了,并且字母已经被小写了。
这其实是一个非常需要注意的地方。如果我们想同时使用同义词特性与词根提取(stemming)特性,那么 jumps
、 jumped
、 jump
、 leaps
、 leaped
和 leap
这些词是否都会被索引成一个 jump
?
我们 可以把同义词过滤器放置在词根提取之前,然后把所有同义词以及词形变化都列举出来:
"jumps,jumped,leap,leaps,leaped => jump"
但更简洁的方式是将同义词过滤器放置在词根过滤器之后,然后把词根形式的同义词列举出来:
"leap => jump"
大小写敏感的同义词edit
通常,我们把同义词过滤器放置在 lowercase
语汇单元过滤器之后,因此,所有的同义词 都是小写。
但有时会导致奇怪的合并。例如, CAT scan (造影扫描图)
和一只 cat
有很大的不同,或者 PET
(正电子发射断层扫描)和 pet
。
就此而言,姓 Little
也是不同于形容词 little
的 (尽管当一个句子以它开头时,首字母会被大写)。
如果根据使用情况来区分词义,则需要将同义词过滤器放置在 lowercase
筛选器之前。当然,这意味着同义词规则需要列出所有想匹配的变化(例如, Little、LITTLE、little
)。
相反,可以有两个同义词过滤器:一个匹配大小写敏感的同义词,一个匹配大小写不敏感的同义词。例如,大小写敏感的同义词规则可以是这个样子:
"CAT,CAT scan => cat_scan" "PET,PET scan => pet_scan" "Johnny Little,J Little => johnny_little" "Johnny Small,J Small => johnny_small"
大小不敏感的同义词规则可以是这个样子:
"cat => cat,pet" "dog => dog,pet" "cat scan,cat_scan scan => cat_scan" "pet scan,pet_scan scan => pet_scan" "little,small"
大小写敏感的同义词规则不仅会处理 CAT scan
,而且有时候也可能会匹配到 CAT scan
中的 CAT
(注:从而导致 CAT scan
被转化成了同义词 cat_scan scan
)(这里的原英文内容有问题,翻译的很可能不对!) 。出于这个原因,在大小写敏感的同义词列表中会有一个针对较坏替换情况的特异规则 cat_scan scan
。
可以看到它们可以多么轻易地变得复杂。同平时一样, analyze
API 是帮手,用它来检查分析器是否正确配置。参考 测试分析器.