同义词标记过滤器
编辑同义词标记过滤器
编辑synonym
标记过滤器允许在分析过程中轻松处理同义词。
定义同义词集合
编辑同义词集合中的同义词使用同义词规则定义。每个同义词规则都包含同义词的词语。
您可以使用两种格式定义同义词规则:Solr 和 WordNet。
Solr 格式
编辑此格式使用两种不同的定义
-
等效同义词:定义等效的词语组。词语之间用逗号分隔。例如
ipod, i-pod, i pod computer, pc, laptop
-
显式同义词:将一组词语匹配到其他词语。规则定义左侧的词语会扩展为右侧描述的所有可能性。例如
personal computer => pc sea biscuit, sea biscit => seabiscuit
WordNet 格式
编辑WordNet 定义跨越多行的同义词集合。每行包含以下信息
- 同义词集合数字标识符
- 同义词在同义词集合中的序号
- 同义词词语
- 词语类型标识符:名词 (n)、动词 (v)、形容词 (a) 或副词 (b)。
- 词语在同义词网络中的深度
以下示例定义了词语“come”、“advance”和“approach”的同义词集合
s(100000002,1,'come',v,1,0). s(100000002,2,'advance',v,1,0). s(100000002,3,'approach',v,1,0).""";
配置同义词集合
编辑可以使用同义词 API、同义词文件或直接在标记过滤器配置中内联配置同义词。有关每个选项的更多详细信息,请参阅存储您的同义词集合。
使用 synonyms_set
配置选项来提供通过同义词管理 API 创建的同义词集合
"filter": { "synonyms_filter": { "type": "synonym", "synonyms_set": "my-synonym-set", "updateable": true } }
同义词集合必须存在才能添加到索引。如果创建索引时引用了不存在的同义词集合,则索引将保持部分创建且无法操作的状态。从这种情况中恢复的唯一方法是确保同义词集合存在,然后删除并重新创建索引,或关闭并重新打开索引。
使用 synonyms_path
提供同义词文件
"filter": { "synonyms_filter": { "type": "synonym", "synonyms_path": "analysis/synonym-set.txt" } }
以上配置了一个 synonym
过滤器,其路径为 analysis/synonym-set.txt
(相对于 config
位置)。
使用 synonyms
定义内联同义词
"filter": { "synonyms_filter": { "type": "synonym", "synonyms": ["pc => personal computer", "computer, pc, laptop"] } }
其他设置包括
-
updateable
(默认为false
)。如果为true
,则允许重新加载搜索分析器以获取同义词文件的更改。仅用于搜索分析器。 -
expand
(默认为true
)。扩展等效同义词规则的定义。请参阅扩展等效同义词。 -
lenient
(默认为updateable
设置的值)。如果为true
,则在解析同义词规则时忽略错误。重要的是要注意,只有无法解析的那些同义词规则会被忽略。有关无效同义词规则的lenient
行为示例,请参阅同义词和停止标记过滤器。
expand
等效同义词规则
编辑expand
参数控制是否扩展等效同义词规则。考虑一个像这样定义的同义词
foo, bar, baz
使用 expand: true
,同义词规则将扩展为
foo => foo foo => bar foo => baz bar => foo bar => bar bar => baz baz => foo baz => bar baz => baz
当 expand
设置为 false
时,同义词规则不会扩展,并且第一个同义词被视为规范表示。该同义词将等效于
foo => foo bar => foo baz => foo
expand
参数不影响显式同义词规则,例如 foo, bar => baz
。
tokenizer
和 ignore_case
已弃用
编辑tokenizer
参数控制用于标记同义词的标记器,此参数用于向后兼容 6.0 之前创建的索引。ignore_case
参数仅与 tokenizer
参数一起使用。
使用同义词标记过滤器配置分析器
编辑要应用同义词,您需要将同义词标记过滤器包含到分析器中
"analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["stemmer", "synonym"] } }
标记过滤器排序
编辑标记过滤器的顺序很重要。文本将首先通过同义词过滤器之前的过滤器进行处理,然后再由同义词过滤器处理。
Elasticsearch 还将使用标记器链中同义词过滤器之前的标记过滤器来解析同义词文件或同义词集合中的条目。在上面的示例中,同义词标记过滤器放置在词干分析器之后。词干分析器也将应用于同义词条目。
由于同义词映射中的条目不能具有堆叠位置,因此某些标记过滤器可能会在此处导致问题。产生多个标记版本的标记过滤器可能会选择在解析同义词时要发出哪个版本的标记。例如,asciifolding
将仅生成标记的折叠版本。其他标记过滤器(如 multiplexer
、word_delimiter_graph
或 ngram
)将引发错误。
如果需要构建包含多标记过滤器和同义词过滤器的分析器,请考虑使用多路复用器过滤器,其中多标记过滤器位于一个分支中,而同义词过滤器位于另一个分支中。
同义词和 stop
标记过滤器
编辑同义词和停止标记过滤器以以下方式相互交互
停止标记过滤器在同义词标记过滤器之前
编辑停止词将从同义词规则定义中删除。这可能会导致同义词规则出现错误。
如果 lenient
设置为 false
,则在应用分析器更改时,无效的同义词规则可能会导致错误。对于可重新加载的分析器,这会阻止重新加载和应用更改。您必须更正同义词规则中的错误并重新加载分析器。
当 lenient
设置为 false
时,具有无效同义词规则的索引无法重新打开,从而使其在以下情况下无法操作
- 包含索引的节点启动
- 索引从关闭状态打开
- 发生节点重启(这将重新打开分配的节点分片)
对于显式同义词规则,例如 foo, bar => baz
,其中停止过滤器删除 bar
- 如果
lenient
设置为false
,则会引发错误,因为bar
将从同义词规则的左侧删除。 - 如果
lenient
设置为true
,则会添加规则foo => baz
,并且会忽略bar => baz
。
如果停止过滤器改为删除 baz
- 如果
lenient
设置为false
,则会引发错误,因为baz
将从同义词规则的右侧删除。 - 如果
lenient
设置为true
,则同义词将不起作用,因为目标词已删除。
对于等效同义词规则,例如 foo, bar, baz
和 expand: true
,其中停止过滤器删除 `bar`
- 如果
lenient
设置为false
,则会引发错误,因为bar
将从同义词规则中删除。 - 如果
lenient
设置为true
,则添加的同义词将等效于以下同义词规则,这些规则不包含已删除的词
foo => foo foo => baz baz => foo baz => baz
停止标记过滤器在同义词标记过滤器之后
编辑停止过滤器将从生成的同义词扩展中删除词条。
例如,同义词规则(如 foo, bar => baz
)和删除 baz
的停止过滤器将无法匹配 foo
或 bar
,因为两者都会扩展为 baz
,而 baz
会被停止过滤器删除。
如果停止过滤器改为删除 foo
,那么搜索 foo
将会扩展为 baz
,而 baz
不会被停止过滤器删除,因此可能会为 baz
提供匹配项。