У меня есть приложение Symfony 2.7.6, использующее FOSElasticaBundle.
У меня есть 2 вида поиска:
Один без ключевого слова, в этом случае применяются только фильтры, и все документы оцениваются в 1 (иногда в случайном порядке), в этом случае основной запрос:
$query = new Elastica\Query\MatchAll();
Один с ключевым словом, применяются те же фильтры, и при совпадении снова запускается список полей (одно с другим усилением). И результаты сохраняются по баллам. Основной запрос сейчас:
$match = new Elastica\Query\MultiMatch();
$match->setQuery($keyword);
$match->setOperator('AND');
$match->setFields([
'field1^30',
'field2',
'field3',
'field4',
'_all'
]);
Эти 2 поиска работают хорошо.
Теперь для обоих поисков я хочу, чтобы динамическое усиление было применено для данного значения поля. Скажем так: if field5 == 'value' then add boost 15
(15 — просто пример, мы сделаем тесты, чтобы увидеть, какое дополнительное значение усиления должно быть выбрано) используемое здесь значение не является ключевым словом, это другой параметр.
Я пытался с FunctionScore
и с Boosting
запросы, но без успеха. Любая подсказка с очень простым запросом эластичного поиска приветствуется.
Как насчет этого:
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "blabla",
"operator": "AND",
"fields": [
"field1^30",
"field2",
"field3",
"field4",
"_all"]
}
},
"functions": [
{
"filter": {
"term": {
"field5": "some_value"}
},
"boost_factor": 15
}
]
}
}
}
Других решений пока нет …