У нас есть конкретный вариант использования для нашего экземпляра ElasticSearch: мы храним документы, которые содержат собственные имена, даты рождения, адреса, идентификационные номера и другую связанную информацию.
Мы используем плагин для сопоставления имен, который переопределяет оценку ES по умолчанию и назначает оценку релевантности от 0 до 1 в зависимости от того, насколько близко совпадает имя.
Что нам нужно сделать, это увеличить этот счет на определенную величину, если другие поля совпадают. Я начал читать на ES сценариев, чтобы достичь этого. Мне нужна помощь в части сценария запроса. Прямо сейчас наш запрос выглядит так:
{
"size":100,
"query":{
"bool":{
"should":[
{"match":{"Name":"John Smith"}}
]
}
},
"rescore":{
"window_size":100,
"query":{
"rescore_query":{
"function_score":{
"doc_score":{
"fields":{
"Name":{"query_value":"John Smith"},
"DOB":{
"function":{
"function_score":{
"script_score":{
"script":{
"lang":"painless",
"params":{
"query_value":"01-01-1999"
},
"inline":"if **<HERE'S WHERE I NEED ASSISTANCE>**"
}
}
}
}
}
}
}
}
},
"query_weight":0.0,
"rescore_query_weight":1.0
}
}
Поле Name
всегда будет требоваться в запросе и является основой для оценки, которая возвращается в поле _score
по умолчанию; для простоты демонстрации мы просто добавим еще одно поле, DOB
, которое в случае совпадения должно повысить оценку на 0,1. Я считаю, что я ищу что-то вроде if(query_value == doc['DOB'].value add 0.1 to _score)
или что-то вроде этого.
Итак, какой будет правильным синтаксисом, который будет введен в строку inline
для достижения этой цели? Или, если запрос требует другого пересмотра синтаксиса, пожалуйста, сообщите.
РЕДАКТИРОВАТЬ # 1 - важно подчеркнуть, что наше поле DOB
является полем text
, а не date
.