扁平化图标记过滤器编辑

扁平化由图标记过滤器(例如 synonym_graphword_delimiter_graph)生成的 标记图

扁平化包含 多位置标记 的标记图,使其适合 索引。否则,索引不支持包含多位置标记的标记图。

扁平化图是一个有损过程。

如果可能,请避免使用 flatten_graph 过滤器。相反,仅在 搜索分析器 中使用图标记过滤器。这将消除对 flatten_graph 过滤器的需求。

flatten_graph 过滤器使用 Lucene 的 FlattenGraphFilter

示例编辑

要了解 flatten_graph 过滤器的工作原理,您首先需要生成一个包含多位置标记的标记图。

以下 分析 API 请求使用 synonym_graph 过滤器将 dns 作为 domain name system 的多位置同义词添加到文本 domain name system is fragile

response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      {
        type: 'synonym_graph',
        synonyms: [
          'dns, domain name system'
        ]
      }
    ],
    text: 'domain name system is fragile'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "synonym_graph",
      "synonyms": [ "dns, domain name system" ]
    }
  ],
  "text": "domain name system is fragile"
}

该过滤器生成以下标记图,其中 dns 作为多位置标记。

token graph dns synonym ex

索引不支持包含多位置标记的标记图。为了使此标记图适合索引,需要对其进行扁平化。

要扁平化标记图,请在之前的分析 API 请求中,在 synonym_graph 过滤器之后添加 flatten_graph 过滤器。

response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      {
        type: 'synonym_graph',
        synonyms: [
          'dns, domain name system'
        ]
      },
      'flatten_graph'
    ],
    text: 'domain name system is fragile'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "synonym_graph",
      "synonyms": [ "dns, domain name system" ]
    },
    "flatten_graph"
  ],
  "text": "domain name system is fragile"
}

该过滤器生成以下扁平化标记图,该图适合索引。

token graph dns invalid ex

添加到分析器编辑

以下 创建索引 API 请求使用 flatten_graph 标记过滤器来配置一个新的 自定义分析器

在此分析器中,自定义 word_delimiter_graph 过滤器生成包含连接的多位置标记的标记图。 flatten_graph 过滤器扁平化这些标记图,使其适合索引。

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_custom_index_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'my_custom_word_delimiter_graph_filter',
              'flatten_graph'
            ]
          }
        },
        filter: {
          my_custom_word_delimiter_graph_filter: {
            type: 'word_delimiter_graph',
            catenate_all: true
          }
        }
      }
    }
  }
)
puts response
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_index_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "my_custom_word_delimiter_graph_filter",
            "flatten_graph"
          ]
        }
      },
      "filter": {
        "my_custom_word_delimiter_graph_filter": {
          "type": "word_delimiter_graph",
          "catenate_all": true
        }
      }
    }
  }
}