【Elasticsearch】Token Graphs
Elasticsearch 的Token Graphs是一种用于处理文本分析的高级功能,主要用于处理多词同义词、短语匹配等复杂场景。以下是关于 Token Graphs 的详细解释:
1.什么是 Token Graphs
Token Graphs 是一种有向无环图(DAG),用于表示文本流中的标记(tokens)及其位置关系。在 Token Graph 中:
• 每个位置(position)表示一个节点(node)。
• 每个标记(token)表示一条边(edge),指向下一个位置。
2.标记的位置和长度
在 Token Graph 中,每个标记都有两个重要属性:
• 位置(Position):标记在流中的位置。
• 位置长度(Position Length):标记跨越的位置数量。
例如,对于短语“domain name system”,其标记图可能如下:
• `domain`的位置为 0,位置长度为 1。
• `name`的位置为 1,位置长度为 1。
• `system`的位置为 2,位置长度为 1。
如果添加了同义词`dns`,则`dns`的位置为 0,位置长度为 3。
3.多位置标记
某些标记过滤器(如`synonym_graph`和`word_delimiter_graph`)可以生成跨越多个位置的标记。例如:
• 将“automatic teller machine”替换为“atm”。
• 将“domain name system”替换为“dns”。
4.标记图的用途
索引阶段
索引阶段不支持包含多位置标记的 Token Graphs。因此,需要使用`flatten_graph`过滤器将 Token Graph 展平,使其适合索引。
搜索阶段
在搜索阶段,Token Graphs 可以用于生成多个子查询。例如,用户搜索“domain name system is fragile”,Token Graph 会生成以下子查询:
• `dns is fragile`
• `domain name system is fragile`。
5.如何生成 Token Graphs
可以通过 Elasticsearch 的分析器(Analyzer)和标记过滤器(Token Filter)生成 Token Graphs。例如:
```json
GET /_analyze
{
"tokenizer": "standard",
"filter": [
{
"type": "synonym_graph",
"synonyms": [ "dns, domain name system" ]
}
],
"text": "domain name system is fragile"
}
```
上述请求会生成一个包含多位置标记的 Token Graph。
6.展平 Token Graphs
为了使 Token Graphs 适合索引,可以使用`flatten_graph`过滤器。例如:
```json
GET /_analyze
{
"tokenizer": "standard",
"filter": [
{
"type": "synonym_graph",
"synonyms": [ "dns, domain name system" ]
},
"flatten_graph"
],
"text": "domain name system is fragile"
}
```
展平后的 Token Graph 会丢失一些位置信息,但适合索引。
7.注意事项
• 避免使用无效的 Token Graphs:某些标记过滤器(如`synonym`和`word_delimiter`)仅记录默认的位置长度(1),这可能导致生成无效的 Token Graphs,从而引发意外的搜索结果。
• 性能影响:展平 Token Graphs 是一个有损过程,建议仅在必要时使用。
通过合理使用 Token Graphs,可以显著提升 Elasticsearch 在处理复杂文本分析和搜索场景时的灵活性和准确性。