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

时间:2017-09-06 06:57:05

标签: elasticsearch search search-engine relevance

我正在寻找一种方法来处理elasticsearch与文档名称的相关性,例如“bottle”和“瓶盖”

当有人寻找“瓶子”(搜索词)时, - “瓶盖”的得分应低于“红瓶”。

目前我们的搜索引擎得分“红色瓶子”与“500ml瓶装瓶盖”相关性较低

1 个答案:

答案 0 :(得分:1)

这不是您可以在Elasticsearch中解决的问题,而无需添加更多信息。你想要排名"红瓶"过度"瓶盖"因为你知道这些名字的语义信息 - 你知道"红瓶"意味着它所谈论的是一瓶"瓶盖"瓶盖"意味着它所谈论的东西是其他东西(与瓶子有关,但实际上不是瓶子)。如果您希望Elasticsearch的排名考虑到这些信息,您必须为信息编制索引(可能会添加一个关键字标记字段,一个用"一瓶"一个用"瓶盖" - - 您将不得不尝试查看哪些内容适用于您的用例)。当然,这意味着一个人必须为所有内容添加广告标签。

但是,我怀疑你可以通过unique filter改善一些情况。我的猜测是你不会在一个标题中关注术语频率(" 500ml瓶装瓶盖"瓶子更多关于瓶子因为"瓶子"它出现了两次 - 术语频率对我认为这样的标题没什么意义。所以你可以这样做:

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"}
  }
}