2013-11-09 6 views
0

Я новичок в поиске эластичности, и вот мой сценарий, который я пытаюсь решить. У меня есть поле ввода поиска, которое поддерживает логику автозапусков. Результаты получены из индекса упругости, который использует фильтр ngram. То, что я хочу улучшить, - это представить возможность подсчета очков, чтобы упорядочить результаты от самого важного к менее важному (в зависимости от оценки). Счет должен быть основан на следующих случаях:оценка эластичности на основе регулярного выражения с использованием mvel

  • Если есть совпадение, которое начинается с заданной строки, установите счет 100
  • Если есть совпадение, которое содержит данную строку и не начинается с он установил счет до 10

Для этого был реализован скрипт эластики с операторами 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. Не могли бы вы помочь решить мою проблему? Если есть другой подход/решение, не стесняйтесь поделиться им со мной.

Спасибо заранее

+0

Опубликуйте свой сценарий, что произойдет, когда вы попробуете его, и чего вы ожидаете. – kielni

+0

Привет, kielni, я разместил его. – elviento

ответ

0

doc['name'].value загружает анализируемый версию поля. Если ваше поле не будет проанализировано, это, вероятно, будет сильно отличаться от исходного содержимого поля и не полезно для выполнения регулярных совпадений. В документах Elasticsearch по адресу script fields говорится, что это имеет смысл только для неанализируемых или одноразовых полей. Например, если ваш контент индексируется как ngrams, это значение будет состоять из ngrams.

Вы можете получить исходный текст в поле, используя _source.field_name, а затем вычислить свою оценку на основе этого. Вы все равно можете выполнять поиск обычным способом против ngrams и использовать _source только для подсчета очков.

Вот пример function_score запрос, который по умолчанию счет до _score, добавляет 100, если поле имя начинается с одного, еще добавляет 10, если поле содержит имя один где-нибудь еще. Он использует _source.name для доступа к содержимому поля имени, поэтому он выполняет регулярное выражение против исходного текста поля имени, а не ngrams, вычисленного из поля имени.

{ 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "script_score": { 
     "script": "total = _score; if (_source.name ~= '^one.*') { total += 100 } else if (_source.name ~= '.*?one.*?') { total += 10 } return total" 
     } 
    } 
    } 
} 
+0

Это работает просто отлично, спасибо! – elviento