使用同义词进行搜索
编辑使用同义词进行搜索
编辑同义词是具有相同或相似含义的词或短语。它们是搜索的重要方面,因为它们可以改善搜索体验并扩大搜索结果的范围。
同义词允许您
- 提高搜索相关性,找到使用不同术语表达相同概念的相关文档。
- 使 特定领域的词汇 更加用户友好,允许用户使用他们更熟悉的搜索词。
- 定义常见的拼写错误和打字错误,以透明地处理常见错误。
同义词使用 同义词集 分组在一起。您可以根据需要拥有任意数量的同义词集。
为了在 Elasticsearch 中使用同义词集,您需要
存储您的同义词集
编辑您的同义词集需要存储在 Elasticsearch 中,以便您的分析器可以引用它们。有三种方法可以存储您的同义词集
同义词 API
编辑您可以使用 同义词 API 来管理同义词集。这是最灵活的方法,因为它允许动态定义和修改同义词集。
同义词集中的更改将自动重新加载关联的分析器。
同义词文件
编辑您可以将同义词集存储在文件中。
同义词集文件需要上传到所有集群节点,并位于 Elasticsearch 发行版的配置目录中。如果您正在使用 Elasticsearch Service,则可以使用 自定义捆绑包 上传同义词文件。
一个同义词文件示例
# Blank lines and lines starting with pound are comments. # Explicit mappings match any token sequence on the left hand side of "=>" # and replace with all alternatives on the right hand side. # These types of mappings ignore the expand parameter in the schema. # Examples: i-pod, i pod => ipod sea biscuit, sea biscit => seabiscuit # Equivalent synonyms may be separated with commas and give # no explicit mapping. In this case the mapping behavior will # be taken from the expand parameter in the token filter configuration. # This allows the same synonym file to be used in different synonym handling strategies. # Examples: ipod, i-pod, i pod foozball , foosball universe , cosmos lol, laughing out loud # If expand==true in the synonym token filter configuration, # "ipod, i-pod, i pod" is equivalent to the explicit mapping: ipod, i-pod, i pod => ipod, i-pod, i pod # If expand==false, "ipod, i-pod, i pod" is equivalent # to the explicit mapping: ipod, i-pod, i pod => ipod # Multiple synonym mapping entries are merged. foo => foo bar foo => baz # is equivalent to foo => foo bar, baz
要更新现有的同义词集,请将新文件上传到您的集群。同义词集文件必须在每个集群节点上保持同步。
当同义词集更新时,使用它的搜索分析器需要使用 重新加载搜索分析器 API 进行刷新
这种手动同步和重新加载使得这种方法不如使用 同义词 API 灵活。
内联
编辑您可以通过直接在标记过滤器定义中内联添加同义词来测试它们。
不建议在生产环境中使用内联同义词。大量的内联同义词会不必要地增加集群大小,并可能导致性能问题。
配置同义词标记过滤器和分析器
编辑创建同义词集后,您可以开始配置标记过滤器和分析器以使用它们。
同义词集必须存在才能添加到索引中。如果创建的索引引用了不存在的同义词集,则该索引将保持部分创建且无法操作的状态。从这种情况恢复的唯一方法是确保同义词集存在,然后删除并重新创建索引,或关闭并重新打开索引。
应用分析器更改时,无效的同义词规则可能会导致错误。对于可重新加载的分析器,这会阻止重新加载和应用更改。您必须更正同义词规则中的错误并重新加载分析器。
具有无效同义词规则的索引无法重新打开,使其在以下情况下无法操作
- 包含索引的节点启动
- 索引从关闭状态打开
- 发生节点重启(重新打开分配给节点的碎片)
Elasticsearch 使用同义词作为 分析过程 的一部分。您可以使用两种类型的 标记过滤器 来包含同义词
查看每个同义词标记过滤器文档,了解配置详细信息以及将其添加到分析器的说明。
测试您的分析器
编辑您可以在不修改索引设置的情况下测试分析器配置。使用 分析 API 测试您的分析器链
resp = client.indices.analyze( tokenizer="standard", filter=[ "lowercase", { "type": "synonym_graph", "synonyms": [ "pc => personal computer", "computer, pc, laptop" ] } ], text="Check how PC synonyms work", ) print(resp)
response = client.indices.analyze( body: { tokenizer: 'standard', filter: [ 'lowercase', { type: 'synonym_graph', synonyms: [ 'pc => personal computer', 'computer, pc, laptop' ] } ], text: 'Check how PC synonyms work' } ) puts response
const response = await client.indices.analyze({ tokenizer: "standard", filter: [ "lowercase", { type: "synonym_graph", synonyms: ["pc => personal computer", "computer, pc, laptop"], }, ], text: "Check how PC synonyms work", }); console.log(response);
GET /_analyze { "tokenizer": "standard", "filter" : [ "lowercase", { "type": "synonym_graph", "synonyms": ["pc => personal computer", "computer, pc, laptop"] } ], "text" : "Check how PC synonyms work" }
在索引时或搜索时应用同义词
编辑分析器可以在 索引时或搜索时 应用。
您需要决定何时应用您的同义词
使用 同义词 API 创建的同义词集只能在搜索时使用。
您可以将包含同义词集的分析器指定为 搜索时分析器 或 索引时分析器。
以下示例将 my_analyzer
作为搜索分析器添加到索引映射中的 title
字段
"mappings": { "properties": { "title": { "type": "text", "search_analyzer": "my_analyzer", "updateable": true } } }