Я новичок в эластичном поиске, и вот мой сценарий, который я пытаюсь решить. У меня есть поле ввода поиска, которое поддерживает логику самовнушения. Результаты извлекаются из эластичного индекса, который использует фильтр ngram. Что я хочу улучшить, так это ввести возможность подсчета очков, чтобы упорядочивать результаты от наиболее важных к менее важным (в зависимости от оценки). Оценка должна основываться на следующих случаях:
- Если есть совпадение, которое начинается с данной строки, установите счет 100
- Если есть совпадение, содержащее заданную строку и не начинающееся с нее, установите счет равным 10.
Для этой цели был реализован скрипт elastica с операторами mvel для поддержки соответствия регулярным выражениям. Другими словами, он проверяет, соответствует ли значение слева регулярному выражению справа (только тогда переменная соответственно увеличивается). Но, к сожалению, это происходит неправильно, когда строка поиска зависит от языка, несмотря на то, что значение слева также относится к указанному языку. Еще одна проблема, с которой нужно справиться, - это второй случай, о котором я упоминал выше (не могу заставить его работать).
Скрипт, когда значение («один пример» (принадлежит к полю имени)) начинается с заданного слова («один»), работает нормально.
$testParam = mb_strtolower('one', 'utf-8');
$regexStart = '^' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 100; } return total; ");
Скрипт, когда значение («один пример» (принадлежит к полю имени)) содержит заданное слово («пример»), не работает, и в результате общий балл остается равным 1, а не увеличивается до 11, как должно быть.
$testParam = mb_strtolower('example', 'utf-8');
$regexStart = '^.*' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 10; } return total; ");
И, наконец, по той же логике, когда я пытаюсь сопоставить греческое слово со значением (содержащим греческие буквы) поля имени, приращение общего балла также игнорируется.
Вся работа была сделана с помощью резинки, не говоря уже о php. Не могли бы вы помочь решить мою проблему? Если есть другой подход/решение, не стесняйтесь поделиться им со мной.
заранее спасибо