如何在 elasticsearch 中获得同义词匹配的自动建议

How can I get auto-suggestions for synonyms match in elasticsearch

我正在使用下面的代码,当我输入 "cu"[= 时,它不会自动建议 curd 14=]

但它确实与文件中的酸奶相匹配,这是正确的。 如何获得同义词的自动完成和同义词的文档匹配?

PUT products
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym_analyzer": {
            "tokenizer": "standard",
            "filter": [
            "lowercase",
              "synonym_graph"
            ]
          }
        },
        "filter": {
          "synonym_graph": {
            "type": "synonym_graph",
            "synonyms": [
               "yogurt, curd, dahi"
            ]
          }
        }
      }
    }
  }
}
PUT products/_mapping
{
  "properties": {
    "description": {
      "type": "text",
      "analyzer": "synonym_analyzer"
    }
  }
}
POST products/_doc
{
  "description": "yogurt"
}
GET products/_search
{
  "query": {
    "match": {
      "description": "cu"
    }
  }
}

当您在 synonym_graph 过滤器中提供同义词列表时,这仅意味着 ES 将互换处理任何同义词。但是当他们通过 standard analyzer, only full-word tokens will be produced:

分析时
POST products/_analyze?filter_path=tokens.token
{
  "text": "yogurt",
  "field": "description"
}

产量:

{
  "tokens" : [
    {
      "token" : "curd"
    },
    {
      "token" : "dahi"
    },
    {
      "token" : "yogurt"
    }
  ]
}

因此,常规 match_query 不会在这里删除它,因为标准分析器没有在可匹配的子字符串方面为它提供足够的上下文 (n-grams)。

与此同时,您可以将 match 替换为 match_phrase_prefix,这正是您所追求的——在获取时匹配有序的字符序列考虑同义词:

GET products/_search
{
  "query": {
    "match_phrase_prefix": {
      "description": "cu"
    }
  }
}

但是,正如查询名称所暗示的那样,它仅适用于前缀。如果您喜欢自动完成建议术语,而不管子字符串匹配发生在何处,请查看我的其他答案.