Как предотвратить разрушение шарда у упругого поиска при работе с ответной функцией - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно выполнить эластичный поисковый запрос, где мне нужно изменить оценку документов, которые были получены по запросу. Я использую function_score, чтобы изменить счет с помощью обратной функции. Ниже приведен мой код,

{
        "function_score": {
            "query": {
                "bool": {
                    "must": [{"match":{"course": "IT"}}]
                }
            },
            "functions": [{
                    "field_value_factor": {
                        "field": "users_score_nested.rank",
                        "modifier": "reciprocal",
                        "missing": 1
                    }
                }
            ],
            "boost_mode": "multiply",
            "score_mode": "sum"
        }
    }

Здесь мне нужно изменить свой счет на основе фильтра по полю курса, а также по полю ранга. Значение ранга может иметь значения, такие как 0, NULL, 1, 2. Оценка должна быть высокой для кандидата, имеющего высокий ранг (Наименьшее значение ранга). Но из-за 0 или NULL-значения происходит сбой шарда. Есть ли способ предотвратить сбой осколка, кроме изменения значений ранга Или я могу использовать любую другую функцию, кроме обратной функции?

Я получаю следующую ошибку:

{
    "root_cause": [{
        "type": "exception",
        "reason": "Result of field modification [reciprocal(0.0)] must be a number"
    }],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query"
 }

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Все, что вы можете сделать, это удалить «users_score_nested.rank» из данных так, чтобы «отсутствующий» параметр запроса function_score вступил в действие, а ответное значение равно 1.

Боюсь, что нет способа обойти исключение. В качестве альтернативы вы можете использовать параметр script_score запроса function_score

"script_score" : {
            "script" : {
                "source": "Math.pow(doc['users_score_nested']['rank']+1,-1)"
            }
        }

ПРИМЕЧАНИЕ. Убедитесь, что "type" поля "rank" равно "integer" и включено в родительский элемент как часть отображений.

0 голосов
/ 10 апреля 2019

Наконец-то я нашел способ предотвратить сбой осколка. Я сделал следующее, что помогло мне избежать осколков.

{
    "function_score": {
        "query": {
            "bool": {
                "must": [{"match":{"course": "IT"}},
                         {"terms":{"users_score_nested.rank": [1, 2]}}]
            }
        },
        "functions": [{
                "field_value_factor": {
                    "field": "users_score_nested.rank",
                    "modifier": "reciprocal",
                    "missing": 1
                }
            }
        ],
        "boost_mode": "multiply",
        "score_mode": "sum"
    }
}

Здесь сначала он отфильтрует данные на основе запроса bool, затем только на отфильтрованных данных ES выполнит вычисление оценки . Таким образом, значения рангов, которые вызывают сбой осколка, то есть 0 и NULL, будут отфильтрованы.

...