同义词词元过滤器编辑

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(默认为 false)。如果为 true,则在解析同义词配置时忽略异常。重要的是要注意,只有那些无法解析的同义词规则才会被忽略。例如,请考虑以下请求
response = client.indices.create(
  index: 'test_index',
  body: {
    settings: {
      index: {
        analysis: {
          analyzer: {
            synonym: {
              tokenizer: 'standard',
              filter: [
                'my_stop',
                'synonym'
              ]
            }
          },
          filter: {
            my_stop: {
              type: 'stop',
              stopwords: [
                'bar'
              ]
            },
            synonym: {
              type: 'synonym',
              lenient: true,
              synonyms: [
                'foo, bar => baz'
              ]
            }
          }
        }
      }
    }
  }
)
puts response
PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "standard",
            "filter": [ "my_stop", "synonym" ]
          }
        },
        "filter": {
          "my_stop": {
            "type": "stop",
            "stopwords": [ "bar" ]
          },
          "synonym": {
            "type": "synonym",
            "lenient": true,
            "synonyms": [ "foo, bar => baz" ]
          }
        }
      }
    }
  }
}

对于上述请求,单词 bar 被跳过,但映射 foo => baz 仍然被添加。但是,如果要添加的映射是 foo, baz => bar,则不会向同义词列表添加任何内容。这是因为映射的目标词本身被消除了,因为它是一个停用词。类似地,如果映射是“bar, foo, baz”并且 expand 设置为 false,则不会添加任何映射,因为当 expand=false 时,目标映射是第一个词。但是,如果 expand=true,则添加的映射将等效于 foo, baz => foo, baz,即除停用词之外的所有映射。

tokenizerignore_case 已弃用编辑

tokenizer 参数控制将用于对同义词进行标记化的标记器,此参数是为了向后兼容在 6.0 之前创建的索引。ignore_case 参数仅与 tokenizer 参数一起使用。

使用同义词词元过滤器配置分析器编辑

要应用同义词,您需要在分析器中包含同义词词元过滤器

      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["stemmer", "synonym_graph"]
        }
      }
词元过滤器排序编辑

顺序对于您的词元过滤器很重要。文本将首先通过同义词过滤器之前的过滤器进行处理,然后再由同义词过滤器进行处理。

Elasticsearch 还将使用标记器链中同义词过滤器之前的词元过滤器来解析同义词文件或同义词集中的条目。在上面的示例中,同义词图词元过滤器位于词干提取器之后。词干提取器也将应用于同义词条目。

同义词规则不应包含在链中稍后出现的过滤器(如 stop 过滤器)删除的词。从同义词规则中删除一个词意味着在查询时将不会匹配它。

因为同义词映射中的条目不能具有堆叠位置,所以某些词元过滤器可能会导致此处出现问题。生成词元的多个版本的词元过滤器可以选择在解析同义词时发出哪个版本的词元。例如,asciifolding 将仅生成词元的折叠版本。其他过滤器,如 multiplexerword_delimiter_graphngram 将抛出错误。

如果您需要构建包含多词元过滤器和同义词过滤器的分析器,请考虑使用多路复用器过滤器,其中多词元过滤器位于一个分支中,而同义词过滤器位于另一个分支中。