Elasticsearch 相关性——具有相似名称的文档

Elasticsearch relevance- documents with similar names

我正在寻找一种方法来处理 elasticsearch 与 "bottle" 和 "bottle caps"

等文档名称的相关性

当有人查找 "bottle"(搜索词)时,- "bottle caps" 的得分应低于 "Red bottles"。

目前我们的搜索引擎评分 "red coloured bottle" 的相关性低于 "Bottle caps for 500ml bottle"

如果不添加更多信息,这不是您可以在 Elasticsearch 中解决的问题。您希望将 "red bottles" 排在 "bottle caps" 之上,因为您知道这些名称的语义信息——您知道 "red bottles" 表示它所谈论的是 "bottle",并且 "bottle caps" 表示它所谈论的是其他东西(与瓶子有关,但实际上不是瓶子)。如果你想让 Elasticsearch 的排名考虑到这些信息,你必须索引信息(也许添加一个关键字标签字段,一个带有 "bottle" 和一个 "bottle caps" - 你将不得不尝试看看什么适用于您的用例)。当然这意味着一个人必须为所有东西打广告标签。

但是,我怀疑您可以通过 unique filter 改善这种情况。我的猜测是您不太关心单个标题中的词频("Bottle caps for 500ml bottle" 与瓶子的关系不大,因为 "bottle" 在其中出现了两次——词频对像这样的标题意义不大这个我觉得)。所以你可以这样做:

PUT /myindex
{
  "settings": {
    "index": {
      "number_of_shards": 1
    },
    "analysis": {
      "analyzer": {
        "uniq_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "porter_stem",
            "unique"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "name": {
          "type": "text",
          "analyzer": "uniq_analyzer"
        }
      }
    }
  }
}

PUT /myindex/doc/1
{"name": "Red coloured bottles"}

PUT /myindex/doc/2
{"name": "Bottle caps for 500ml bottle"}

然后,如果您搜索 bottle,您会发现分数是相同的 — 不完美,但有所改进。如果您想了解分数的来源,可以使用 explain:

POST /myindex
{
  "explain": true,
  "query": {
    "match": 
      {"name": "bottle"}
  }
}