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

时间:2015-02-18 16:45:19

标签: elasticsearch elasticsearch-api

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

我通过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字段存在或单个剧集索引,是否可以运行条件高斯衰减函数?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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