我尝试使用一个查询搜索多个索引,但只将高斯衰减函数应用于其中一个索引上存在的字段。
我通过elasticsearch-api gem运行它,这部分工作得很好。
这是我在奇迹中运行的查询。
GET episodes,shows,keywords/_search?explain
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "AWESOME SAUCE",
"type": "most_fields",
"fields": [ "title", "summary", "show_title"]
}
},
"functions": [
{ "boost_factor": 2 },
{
"gauss": {
"published_at": {
"scale": "4w"
}
}
}
],
"score_mode": "multiply"
}
},
"highlight": {
"pre_tags": ["<span class='highlight'>"],
"post_tags": ["</span>"],
"fields": {
"summary": {},
"title": {},
"description": {}
}
}
}
该查询适用于剧集索引,因为它具有gauss func的published_at字段以发挥其魔力。但是,当在所有索引中运行时,它对于节目和关键字都会失败(对于剧集仍然成功)。
如果published_at字段存在或单个剧集索引,是否可以运行条件高斯衰减函数?
我愿意探索替代方案(即为每个索引运行单独的查询然后合并结果),但认为单个查询在性能方面是最好的。
谢谢!
答案 0 :(得分:1)
您可以添加过滤器以仅将高斯衰减函数应用于文档子集:
{
"filter": {
"exists": {
"field": "published_at"
}
}
"gauss": {
"published_at": {
"scale": "4w"
}
}
}
对于没有该字段的文档,您可以返回0分数:
{
"filter": {
"missing": {
"field": "published_at"
}
}
"script_score": {
"script": "0"
}
}