Java ES wildcardQuery 查询返回评分都为1

问题描述: wildcardQuery模糊查询返回的数据_score 都等于1 导致无法根据评分排序
从而导致 查询AB,结果ABB匹配度更高问题;

在使用 Elasticsearch 的 wildcardQuery 进行模糊查询时,所有匹配的文档都会被分配一个默认评分(score)为 1 的分数。这个默认的评分是针对所有文档的,因此无法根据评分排序。这种情况下,我们需要使用其他评分算法来确定匹配的文档的评分。

Elasticsearch 提供了一些评分算法来计算匹配文档的评分,可以在查询中使用这些算法来替代默认评分。例如,您可以使用 "function_score" 查询来计算自定义评分。例如,您可以使用 "script_score" 来计算自定义评分,如下所示:

GET /my_index/_search
{
  "query": {
    "function_score": {
      "query": {
        "wildcard": {
          "my_field": {
            "value": "AB*"
          }
        }
      },
      "script_score": {
        "script": {
          "source": "_score * 0.5"
        }
      }
    }
  }
}


上面的例子中,我们使用了 "wildcard" 查询来匹配以 "AB" 开头的词汇,然后使用 "script_score" 评分算法将默认评分乘以 0.5,以降低默认评分的权重,使得更高匹配度的文档可以得到更高的评分。

您也可以使用其他评分算法来计算文档的评分,例如 "boost_factor","field_value_factor","random_score" 等等。具体使用哪种评分算法取决于您的需求和数据特点。

是正常情况。因为 wildcardQuery 查询是基于通配符进行模糊匹配的,无法像全文检索那样根据匹配度进行精确评分。通配符查询的评分计算方式为 constant score,即所有匹配到的文档都会被赋予相同的评分值 1。

如果需要根据匹配度进行排序,可以考虑使用 Elasticsearch 的 fuzzy query(模糊查询)或者 match query(匹配查询)。fuzzy query 和 match query 都支持评分计算,并且可以根据匹配度对文档进行排序。其中,fuzzy query 主要用于对单个词进行模糊查询,而 match query 可以对多个字段进行匹配查询
下面是一个使用matchQuery的例子:

GET /my_index/_search
{
  "query": {
    "match": {
      "my_field": {
        "query": "AB",
        "fuzziness": "AUTO"
      }
    }
  }
}


wildcardQuery模糊查询返回的数据_score都等于1可能是因为查询命中了所有的文档,因此文档的评分都是1,导致无法根据评分进行排序。

解决这个问题的方法是,根据业务需要对查询语句进行优化,限制查询结果的数量,或者使用其他的查询方式,如fuzzyQuery等。同时,也可以考虑使用评分更加准确的查询方式,如matchQuery等。如果查询的关键词比较特殊,可以使用自定义的分词器进行分词处理,从而提高查询的准确性。

  • 这篇博客: java操作es之各种高级查询中的 2.6 模糊匹配WildcardQuery 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 对于es关键字或单词的查询我们可以借助QueryBuilders.wildcardQuery方法来操作,只需要指定es中对应的列和要查询的内容即可:

    boolQueryBuilder.must(QueryBuilders.wildcardQuery("name", "spring"+"*"));