У меня есть запрос, который работает достаточно, но я хочу сортировать результаты этого, используя levenshtein между параметром запроса и рассматриваемым полем.
Сейчас я делаю запрос в ES, а затем сортирую в своем приложении. Сейчас я тестирую поле script в сортировке. Это script
import org.elasticsearch.common.logging.*;
ESLogger logger = ESLoggerFactory.getLogger('levenshtein_script');
def str1 = '%s'.split(' ').sort().join(' ');
def str2 = doc['%s'].values.join(' '); //Needed since the field is analyzed. This will change when I reindex the data.
def dist = new int[str1.size() + 1][str2.size() + 1]
(0..str1.size()).each { dist[it][0] = it }
(0..str2.size()).each { dist[0][it] = it }
(1..str1.size()).each { i ->
(1..str2.size()).each { j ->
dist[i][j] = [dist[i - 1][j] + 1, dist[i][j - 1] + 1, dist[i - 1][j - 1] + ((str1[i - 1] == str2[j - 1]) ? 0 : 1)].min()
}
}
def result = dist[str1.size()][str2.size()]
logger.info('Query param: ['+str1+'] | Term: ['+str2+'] | Result: ['+result+']');
return result;
В основном это шаблон (проверьте% s), что я заполняю свое приложение следующим образом
sortScript = String.format(EDIT_DISTANCE_GROOVY_FUNC, fullname, FULLNAME_FIELD_NAME);
Проблема заключается в том, что http://code972.com/blog/2015/03/84-elasticsearch-one-tip-a-day-avoid-costly-scripts-at-all-costs. Что понятно.
Мой вопрос: как я могу делать то, что мне нужно (сортировать результаты по levenshtein) внутри elasticsearch, поэтому я могу избежать накладных расходов в своем приложении. Могу ли я использовать выражения lucene для этого? У вас есть пример? Есть ли другой способ, которым я могу это сделать?
Я использую ElasticSearch 1.7.5 как услугу. Поэтому родные плагины не должны быть первым решением (я не знаю, даже если это возможно, мне нужно будет проверить у моего провайдера, но если это единственное жизнеспособное решение, я сделаю именно это).
UPDATE
Итак, хорошим решением было бы сохранить его в папке config/scripts
, поскольку он будет скомпилирован один раз https://www.elastic.co/blog/running-groovy-scripts-without-dynamic-scripting. script можно индексировать вместо сохранения https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html. Это гораздо удобнее для моего использования. Имеет ли такое поведение поведение компиляции script? Будет ли он компилироваться только один раз?