Elasticsearch script_score从不同的索引获取值

时间:2014-05-17 07:30:52

标签: elasticsearch

我正在尝试使用script_score根据ID值调整特定结果的评分。它适用于基本运行。我不明白如何根据不同的表执行乘法因子的查找。例如,我有一个ID表的MySQL表及其相关的缩放因子。这些因素每小时都在变化,因此需要在查询时使用它们而不是索引时间。虽然这个表是在MySQL中我可以把它放到一个索引中,但我怎么能进行查找。我想它会类似于MySQL中的连接?下面是我想要的想法:

{
  "query": {
    "function_score": {
      "functions": [
        {
          "script_score": {
            "params": {
              "param1": 2,
              "param2": 3.1
            },
            "script": "_score * doc['ID'].value in associated table" //Get the scaling factor of the ID from external table/index
          }
        }
      ],
      "query": {
        "filtered": {
          "query": {
            "match_all": {}
          }
        }
      },
      "boost_mode": "multiply"
    }
  },
  "explain": true
}

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我必须做的是将其分解为2个查询。第一次查询ES索引或数据库表以获取我需要的提升因子,然后第二个查询是ES的主要搜索查询。但是,在构建查询时,我使用第一个查询中的数据动态构建了一部分,从而将提升因子设置为您在第一个查询中提取的数据的变量。它对我来说似乎工作得很好,并没有真正放慢搜索过程。

一个非常简单的例子如下:

$searchParams['index']  = 'someindex';
$searchParams['type']   = 'sometype';
$searchParams['body']['min_score'] = 0.75;
$searchParams['body']['query']['function_score'] = array(
    "query" => array(
        "term" => array("someField"=>$query)
    )
);

foreach($boostFactors as $id=>$factor) {
    $searchParams['body']['query']['function_score']['functions'][] = array(
        "filter" => array(
            "term" => array(
                "id" => $id
            )
        ),
        "script_score" => array("script" => $factor)
    );
}