0

我正在尝试使用一个查询搜索多个索引,但仅将高斯衰减函数应用于其中一个索引上存在的字段。

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

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

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

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

谢谢!

4

2 回答 2

1

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

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

对于没有该字段的文档,您可以返回 0 分:

{
  "filter": {
    "missing": {
      "field": "published_at"
    }
  }
  "script_score": {
    "script": "0"
  }
}
于 2015-11-06T14:06:19.377 回答
0

在较新的 elasticsearch 版本中,您必须使用脚本 score query功能分数查询正在被弃用。

于 2021-10-01T12:14:10.257 回答