В настоящее время я переношу приложение с Solr на Elastic и наткнулся на интересную функцию Solr, которую я не могу воспроизвести в Elastic: запрос к Solr возвращает флаг постобработки, который выполняет проверку качества результата, указывая, все ли токены найдены в поле результата.
q = some_field:(the brown fox)
fl = some_field, full_match:exists(query({!edismax v='some_field:(the brown fox)' mm='100%'}))
Результат Solr выглядит следующим образом:
{
"response": {
"docs": [
{
"some_field": "The Brown Bear",
"full_match": false
},
{
"some_field": "The Quick Brown Fox",
"full_match": true
}
]
}
}
Флаг используется клиентом для дальнейшей обработки результирующих документов, независимо от оценки (которую я пропустил в примере). Я нашел это довольно разумным, поскольку токенизация и распределенная вычислительная мощность Solr используются вместо того, чтобы делать все в клиенте.
Теперь в Elastic я предполагаю, что это должно быть сделано в блоке script_fields
, но на самом деле я понятия не имею, как выполнить подзапрос безболезненным скриптом, и после двух дней исследований я сомневаюсь, что это вообще возможно:
{
"query": {
"match": {
"some_field": "the brown fox"
}
},
"_source": [
"some_field"
],
"script_fields": {
"full_match": {
"script": "???" <-- Search with Painless script?
}
}
}
Любые творческие идеи приветствуются.