Я не знаком с PHP and laravel
, но причина, по которой он не дает результата на bea
b / c, вы используете запрос на совпадение, который применяет тот же анализатор, который используется во время индекса, и Ваш текст bear naked almond bar
создает токены bear
, naked
, almond
и bar
, а bea
не соответствует ни одному токену.
Вы можете изменить свой запрос ниже (не уверен в правильном синтаксисе префикса в laravel).
$model = new ProductsListing;
$items = $this->elasticsearch->search([
'index' => $model->getSearchIndex(),
'type' => $model->getSearchType(),
'body' => [
'query' => [
'prefix' => [. --> changed to prefix query.
'fields' => ['brand', 'name^5', 'description'],
'query' => $query,
],
],
],
]);
Я предполагаю, что вы используете поле text
с анализатором standard
по умолчанию и analysis API, вы можете проверить токены, сгенерированные для вашего текста.
POST your-index / _analyze
{
"text": "bear naked almond bar",
"analyzer" : "standard"
}
{
"tokens": [
{
"token": "bear",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "naked",
"start_offset": 5,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "almond",
"start_offset": 11,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "bar",
"start_offset": 18,
"end_offset": 21,
"type": "<ALPHANUM>",
"position": 3
}
]
}
Дополнительная информация о запросе на совпадение, запросе префикса и различных способах реализации Автозаполнение можно найти в этом блоге.