elasticsearch 如何在Laravel中实现自动完成的弹性搜索
我按照这个精彩的教程在我正在构建的Laravel电子商务应用程序中实现了ES。我让它工作了,但我想稍微调整一下,因为到目前为止,只有当我的查询词与我的一个产品中的整个词完全匹配时,结果才起作用 我有一个叫做bear裸体杏仁棒的健康坚果棒,但当我输入“bea”时,它与任何东西都不匹配,但当我输入“bear”时,它就工作了 这是我目前的搜索查询
elasticsearch 如何在Laravel中实现自动完成的弹性搜索,
elasticsearch,laravel-5,
elasticsearch,Laravel 5,我按照这个精彩的教程在我正在构建的Laravel电子商务应用程序中实现了ES。我让它工作了,但我想稍微调整一下,因为到目前为止,只有当我的查询词与我的一个产品中的整个词完全匹配时,结果才起作用 我有一个叫做bear裸体杏仁棒的健康坚果棒,但当我输入“bea”时,它与任何东西都不匹配,但当我输入“bear”时,它就工作了 这是我目前的搜索查询 $model = new ProductsListing; $items = $this->elasticsearch->search([
$model = new ProductsListing;
$items = $this->elasticsearch->search([
'index' => $model->getSearchIndex(),
'type' => $model->getSearchType(),
'body' => [
'query' => [
'multi_match' => [
'fields' => ['brand', 'name^5', 'description'],
'query' => $query,
],
],
],
]);
我需要一些帮助来调整查询,以便在键入时获得结果。我不熟悉
PHP和laravel
,但是它没有在bea
b/c上给出结果的原因是您使用的匹配查询应用了索引时使用的相同分析器,您的文本熊裸杏仁条
创建熊
、裸
、杏仁
和条
令牌,并且bea
与任何令牌都不匹配。
您可以在下面更改查询(不确定laravel中前缀的语法是否正确)
我假设您正在使用默认标准分析器的文本字段,并且使用API,您可以检查为文本生成的令牌
发布你的索引/\u分析
{
"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
}
]
}
{
“文字”:“熊赤裸杏仁棒”,
“分析器”:“标准”
}
{
“代币”:[
{
“令牌”:“熊”,
“起始偏移量”:0,
“端部偏移”:4,
“类型”:“,
“位置”:0
},
{
“令牌”:“裸体”,
“起始偏移量”:5,
“端部偏移”:10,
“类型”:“,
“职位”:1
},
{
“标记”:“杏仁”,
“起始偏移量”:11,
“端部偏移”:17,
“类型”:“,
“职位”:2
},
{
“令牌”:“条”,
“起始偏移量”:18,
“端部偏移”:21,
“类型”:“,
“职位”:3
}
]
}
尝试匹配短语前缀
与必须在bool内部查询
查询,而不是多重匹配
。。。您将在键入时开始获得结果
例如
$query = '{
"size": 10, //size of return array
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"tag":"' . $filter_name . '"
}
}
],
}
}
}';
//Now pass this $query variable to your ES request
有两种方法1-前缀
,2-匹配短语前缀
请参阅文档,我可以在这里获得帮助:
这是一个完美的解决方案。谢谢你,恩里科·齐穆尔
$elasticsearch = ClientBuilder::create()
->setHosts(config('services.search.hosts'))
->build();
$model = new ProductsListing;
$items = $elasticsearch->search([
'index' => $model->getSearchIndex(),
'type' => $model->getSearchType(),
'body' => [
//this helped a lot
// https://stackoverflow.com/questions/60716639/how-to-implement-elastic-search-in-laravel-for-auto-complete
//using query_string
'query' => [
'query_string' => [
// 'fields' => ['brand', 'name^5', 'description'], //notice the weight operator ^5
'fields' => ['name'],
'query' => $query.'*',
],
],
],
]);
你好,穆罕默德,谢谢你的帮助。这是拉威尔符号吗?语法不起作用。我正在我的laravel应用程序中使用elasticsearch/elasticsearch php。即使我用箭头替换分号,它也不会接受。箭头只是告诉你bool
query的子功能。。。只要研究我的答案所附的代码,并根据你的答案修改它。。。我的代码是在简单的核心php。。。我做了一个DSL查询并将其存储在变量中,然后将其传递给ES函数进行搜索…@NicolasZein,如果您有权访问kibana…请复制并粘贴我的查询(将字段名称更改为您的),然后开始搜索,先搜索1个字母,然后搜索2个字母,再搜索3个字母…希望您能得到结果…@Muhammadhashranwaar,匹配短语前缀将不起作用,如果您有类似于bear alm
等的查询,它将对最后一个词进行前缀查询,并对初始词进行短语搜索terms@NicolasZein添加模糊性也。。。bczmatch\u phrase\u prefix
search from start of keyword.。因此,如果您添加模糊性,则会出现1或2个字母的异常…我尝试实现您的语法时运气不佳,不确定我做错了什么。@NicolasZein,我不知道如何使用php语法,但如果您觉得合适,我可以提供搜索JSON,你也有机会看一看讨论不同方法内部的博客吗?是的,我看了,但我没能让它起作用。elasticsearch/elasticsearch php上的人帮了我,它工作得非常好,我添加了解决方案。你可以检查一下。@NicolasZein,刚刚研究了使用通配符查询的解决方案,这非常昂贵,IMHO前缀查询是一个更好的解决方案。它不是通配符,而是查询字符串。我注意到它的速度非常快。
$elasticsearch = ClientBuilder::create()
->setHosts(config('services.search.hosts'))
->build();
$model = new ProductsListing;
$items = $elasticsearch->search([
'index' => $model->getSearchIndex(),
'type' => $model->getSearchType(),
'body' => [
//this helped a lot
// https://stackoverflow.com/questions/60716639/how-to-implement-elastic-search-in-laravel-for-auto-complete
//using query_string
'query' => [
'query_string' => [
// 'fields' => ['brand', 'name^5', 'description'], //notice the weight operator ^5
'fields' => ['name'],
'query' => $query.'*',
],
],
],
]);