【问题标题】:Scoring higher for shorter fields较短的字段得分较高
【发布时间】:2021-05-03 07:21:28
【问题描述】:

我正在尝试为 Elastic Search 上的最短值获得更高的分数(或至少相同的分数)。 假设我有这些文件:“Abc”、“Abca”、“Abcb”、“Abcc”。 label.ngram 字段使用 EdgeNgram 分析器。 像这样一个非常简单的查询:

{
  "query": {
    "match": {
      "label.ngram": {
        "query": "Ab"
      }
    }
  }
}

我总是首先得到文件“Abca”、“Abcb”、“Abcc”而不是“Abc”。 我怎样才能先得到“Abc”?

(我应该使用这个吗:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-similarity.html?

谢谢!

【问题讨论】:

  • 您能分享一下您的索引映射和设置吗?

标签: elasticsearch similarity


【解决方案1】:

这是由于field normalization 而发生的,要获得相同的分数,您必须禁用该领域的规范。

Norms 存储稍后在查询时使用的各种归一化因子 计算文档相对于 a 的分数的时间 查询。

添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "norms": false,
        "analyzer": "my_analyzer"
      }
    }
  }
}

索引数据:

{
  "title": "Abca"
}
{
  "title": "Abcb"
}
{
  "title": "Abcc"
}
{
  "title": "Abc"
}

搜索查询:

{
  "query": {
    "match": {
      "title": {
        "query": "Ab"
      }
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "65953349",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.1424427,
        "_source": {
          "title": "Abca"
        }
      },
      {
        "_index": "65953349",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.1424427,
        "_source": {
          "title": "Abcb"
        }
      },
      {
        "_index": "65953349",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.1424427,
        "_source": {
          "title": "Abcc"
        }
      },
      {
        "_index": "65953349",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.1424427,
        "_source": {
          "title": "Abc"
        }
      }
    ]

【讨论】:

  • 谢谢,它确实解决了评分问题。但是最小的领域有可能获得更高的分数吗?我应该添加一个带有标签大小的字段并按分数和大小排序吗?
【解决方案2】:

正如@ESCoder 提到的,使用norms 可以修复评分,但这不会很有用,如果你想对搜索结果进行评分,因为这会导致搜索结果中的所有文档具有相同的分数,这将极大地影响您的搜索结果的相关性。

如果您使用的是 ES 5.X 或更高版本,也许您应该调整默认相似性算法 (BM25) 的文档长度规范参数。我尝试使用您的数据集和我的设置执行此操作,但没有成功。

第二个选项主要按照您的建议工作,是将字段的大小存储在不同的字段中(但是)您应该从您的应用程序中填充该字段,因为在分析过程之后,将为同一字段生成各种令牌。但这是额外的开销,我更愿意通过调整相似性算法参数来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2011-03-02
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多