我在获取所需的 Elasticsearch 结果时遇到问题。 我的映射如下所示:
'index' => 'adverts', // Name of the index to create
'body' => [
'mappings' => [
'properties' => [
'id' => ['type' => 'integer'],
'title' => ['type' => 'text'],
'content' => ['type' => 'text'],
]
],
]
当前查询的 PHP 代码如下所示(这不会返回正确的记录):
public function searchAdverts(string $query)
{
$params = [
'index' => 'adverts',
'body' => [
'query' => [
'multi_match' => [
'query' => "{$query}",
'fields' => ['title', 'content'],
'type' => 'phrase_prefix'
]
]
]
];
$response = $this->client->search($params);
return $response;
}
如何修改 PHP Elasticsearch 查询或映射以查找文档中字符串的精确匹配项? 此 SQL 返回所需的结果:
SELECT id, title, content FROM adverts WHERE title LIKE '%$query%' OR content LIKE '%$query%';
既然你正在使用 Laravel,那么你很幸运!我编写了一个包,让您可以利用 Laravel 的 Eloquent 来运行 Elasticsearch 查询,而无需处理复杂的 DSL 对象。看看这里https://github.com/pdphilip/laravel-elasticsearch
在您的情况下,您将创建一个
Advert
模型来映射到您的 adverts
索引,然后简单地:
$results = Advert::where('title', $query)->orWhere('content', $query)->get();
文档:https://elasticsearch.pdphilip.com/querying-models#where
旁注:由于 Elasticsearch 将匹配标记,因此您可以使用普通的
where
子句来搜索部分匹配,这似乎是您需要的;
whereExact('title',$query)
where('color','like','bl)
代替 black
或 blue