问题描述: 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"
}
}
}
}
解决这个问题的方法是,根据业务需要对查询语句进行优化,限制查询结果的数量,或者使用其他的查询方式,如fuzzyQuery等。同时,也可以考虑使用评分更加准确的查询方式,如matchQuery等。如果查询的关键词比较特殊,可以使用自定义的分词器进行分词处理,从而提高查询的准确性。
对于es关键字或单词的查询我们可以借助QueryBuilders.wildcardQuery方法来操作,只需要指定es中对应的列和要查询的内容即可:
boolQueryBuilder.must(QueryBuilders.wildcardQuery("name", "spring"+"*"));