我正在尝试使用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
}
答案 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)
);
}