У меня есть таблица продуктов в базе данных MySql, и я хочу выполнить поиск по названию и описанию их продукта.
Все работает хорошо, если я ввожу полное имя продукта в поиск, но это не так.разбить термин на части.Например, он найдет продукты для термина «пионер», но не найдет ничего для «pio» или «pionee».
Я полагаю, я либо неправильно строю индекс, либо неправильно выполняю поиск?
Я создаю свой индекс следующим образом:
$params = [
'index' => 'products',
'type' => 'product',
'body' => [
'settings' => [
'analysis' => [
'filter' => [
'ngram_filter' => [
"type" => "ngram",
"min_gram" => 1,
"max_gram" => 10
]
],
'analyzer' => [
'ngram_analyzer' => [
"type" => "custom",
"tokenizer" => "standard",
"filter" => [
"lowercase",
"asciifolding",
"ngram_filter"
]
]
]
]
],
'mappings' => [
'products' => [
'name' => [
'type' => 'string',
'include_in_all' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard'
],
'description' => [
'type' => 'string',
'include_in_all' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard'
]
]
]
]
];
Я индексирую результаты БД следующим образом:
foreach($products as $product){
$params = [
'index' => 'products',
'type' => 'product',
'id' => $product['id'],
'body' => [
'name' => $product['name'],
'description' => $product['description']
]
];
$response = $client->index($params);
var_dump($response);
}
И затем для поиска я делаюследующее:
$params = [
'index' => 'products',
'type' => 'product',
'body' => [
'query' => [
'match' => [
'name' => $term
],
'match' => [
'description' => $term
]
]
]
];
$response = $client->search($params);
foreach($response['hits']['hits'] as $result){
echo $result['_source']['name'] . '<br>';
}
print_r($response);