Elasticsearch:如何在文档中多次出现搜索词时防止分数增加?

时间:2014-04-10 21:30:59

标签: lucene elasticsearch

当搜索词不仅出现一次而是多次出现在文档中时,搜索得分也会增加。虽然大多数时候都可能会这样,但这不是我的情况。

查询:

"query": {
  "bool": {
    "should": {
      "nested": {
        "path": "editions",
        "query": {
          "match": {
            "title_author": {
              "query": "look me up",
              "operator": "and",
              "boost": 2
            }
          }
        }
      }
    },
    "must": {
      "nested": {
        "path": "editions",
        "query": {
          "match": {
            "title_author": {
              "query": "look me up",
              "operator": "and",
              "fuzziness": 0.5,
              "boost": 1
            }
          }
        }
      }
    }
  }
}

doc_1

{
  "editions": [
    {
      "editionid": 1,
      "title_author": "look me up look me up",
    },
    {
      "editionid": 2,
      "title_author": "something else",
    }
  ]
}

和doc_2

{
  "editions": [
    {
      "editionid": 3,
      "title_author": "look me up",
    },
    {
      "editionid": 4,
      "title_author": "something else",
    }
  ]
}

现在,由于搜索字词包含两次,因此doc_1的得分会更高。我不想要那个。如何关闭此行为?我想要相同的分数 - 无论在匹配文档中找到一次或两次搜索词。

2 个答案:

答案 0 :(得分:4)

除了@keety@Sid1199所讨论的内容之外,还有另一种方法:“text”类型的字段的特殊属性称为index_options。默认情况下,它设置为“位置”,但您可以将其明确设置为“docs”,因此术语频率不会放在索引中,Elasticsearch在搜索时也不会知道重复。

"title_author": {
    "type": "text",
    "index_options": "docs"
}

答案 1 :(得分:3)

弹性搜索中有一个属性称为"相似性"。有很多类型的相似之处,但这里有用的是" boolean"。如果将相似度设置为" boolean"在您的映射中,它将阻止您的查询多次提升。

"title_author":{"type":"text","similarity":"boolean"}

如果您对此映射运行查询,则无论该单词出现的时间长短,它都只会提升一次。您可以详细了解相似之处here

仅适用于ES版本5.4及以上版本