Elasticsearch - 使用条件衰减函数搜索多个索引

Elasticsearch - search across multiple indices with conditional decay function

我试图通过一个查询跨多个索引进行搜索,但仅将高斯衰减函数应用于存在于其中一个索引上的字段。

我运行通过 elasticsearch-apigem 对此进行了调整,那部分工作正常。

这是我 运行 惊叹不已的查询。

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": {}
   }
 }
}

该查询非常适合剧集索引,因为它具有 published_at 字段供高斯函数发挥其魔力。但是,当 运行 跨越所有索引时,它对于节目和关键字失败(对于剧集仍然成功)。

如果 published_at 字段存在或在单集索引上,是否可以 运行 条件高斯衰减函数?

我愿意探索替代方案(即 运行 对每个索引单独查询,然后合并结果),但我认为单个查询在性能方面是最好的。

谢谢!

您可以添加过滤器以仅将这些高斯衰减函数应用于文档子集:

{
  "filter": {
    "exists": {
      "field": "published_at"
    }
  }
  "gauss": {
    "published_at": {
      "scale": "4w"
    }
  }
}

对于没有该字段的文档,您可以 return 得分为 0:

{
  "filter": {
    "missing": {
      "field": "published_at"
    }
  }
  "script_score": {
    "script": "0"
  }
}

在较新的 elasticsearch 版本中,您必须使用 script score query. The function score 查询已被弃用。