使用同义词

同义词可以取代现有的语汇单元或通过使用 {ref}/analysis-synonym-tokenfilter.html[ 同义词 语汇单元过滤器],添加到语汇单元流中:

  1. PUT /my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "filter": {
  6. "my_synonym_filter": {
  7. "type": "synonym", (1)
  8. "synonyms": [ (2)
  9. "british,english",
  10. "queen,monarch"
  11. ]
  12. }
  13. },
  14. "analyzer": {
  15. "my_synonyms": {
  16. "tokenizer": "standard",
  17. "filter": [
  18. "lowercase",
  19. "my_synonym_filter" (3)
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. }

<1> 首先,我们定义了一个 同义词 类型的语汇单元过滤器。

<2> 我们在 <> 中讨论同义词格式。

<3> 然后我们创建了一个使用 my_synonym_filter 的自定义分析器。

TIP:同义词可以使用 synonym 参数来内嵌指定,或者必须存在于集群每一个节点上的同义词文件中。同义词文件路径由synonyms_path 参数指定,应绝对或相对于 Elasticsearch config 目录。参照 updating-stopwords 的技巧,可以用来刷新的同义词列表。

通过 analyze API 来测试我们的分析器,显示如下:

  1. GET /my_index/_analyze?analyzer=my_synonyms
  2. Elizabeth is the English queen
  1. Pos 1: (elizabeth)
  2. Pos 2: (is)
  3. Pos 3: (the)
  4. Pos 4: (british,english) (1)
  5. Pos 5: (queen,monarch) (1)

<1> 所有同义词与原始词项占有同一个位置。

这样的一个文件将匹配任何以下的查询: English queenBritish queenEnglish monarchBritish monarch 。 即使是一个短语查询也将会工作,因为每个词项的位置已被保存。

TIP

在索引和搜索中使用相同的同义词语汇单元过滤器是多余的。 如果在索引的时候,我们用 englishbritish 这两个术语代替 English ,然后在搜索的时候,我们只需要搜索这些词项中的一个。或者,如果在索引的时候我们不使用同义词,然后在搜索的时候,我们将需要把对 English 的查询转换为 english 或者 british 的查询。

是否在搜索或索引的时候做同义词扩展可能是一个困难的选择。我们将探索更多的选择 synonyms-expand-or-contract