Elasticsearch 8.13.0中如何为日期字段使用similarity进行评分?
解决Elasticsearch 8.13.0中日期字段的评分需求
Elasticsearch 8.13.0之后确实收紧了similarity参数的适用范围,仅支持text和keyword类型字段,日期这类字段不再允许直接配置该参数。如果你需要模拟之前similarity: boolean的评分效果(匹配即得满分,不匹配得0分),可以用以下两种方案:
方案一:使用script_score自定义评分逻辑
直接在查询阶段通过脚本实现boolean评分的效果,适合范围查询、多条件匹配等场景。示例如下:
{ "query": { "script_score": { "query": { // 这里写你的日期查询条件,比如范围匹配 "range": { "birth_date": { "gte": "1990-01-01", "lte": "2000-12-31" } } }, "script": { // 逻辑:如果文档满足查询条件,返回1分;否则0分,和boolean similarity效果一致 "source": "doc['birth_date'].size() > 0 ? 1 : 0" } } } }
方案二:新增keyword子字段并配置similarity
如果你的场景以精确匹配日期为主,可以给日期字段添加一个keyword类型的子字段,在子字段上配置similarity: boolean。示例映射:
{ "mappings": { "properties": { "birth_date": { "type": "date", "fields": { "keyword": { "type": "keyword", "similarity": "boolean" } } } } } }
查询时直接使用这个keyword子字段:
{ "query": { "term": { "birth_date.keyword": "1995-05-15" } } }
需要注意的是,方案二更适合精确匹配单日期的场景,范围查询还是推荐用方案一的脚本评分方式。
内容的提问来源于stack exchange,提问作者km271
相关产品推荐
相关产品推荐

