我还没有找到答案,也许我忽略了它,但这是一个非常简单的问题:
我有Joomla / Virtuemart的搜索模块,我对此模块生成的搜索结果有1个问题。
当我输入此搜索字词时," mysearch "我希望它能够使用属于搜索查询的单词查找所有结果,例如标题:"这是我的搜索"或者"多么好的搜索"
如何使用MySQL实现这一目标?
这是我的工作代码:
$ab = explode(' ', $keyword);
$ccc='';
$ccc2='';
foreach ($ab as $k)
{
if (!empty($k))
{
if($ccc==''){
$ccc.= " concat(product_name, customtitle) RLIKE '".$db->getEscaped($k)."' AND";
}
else{
$ccc.= " concat(product_name, customtitle) RLIKE '".$db->getEscaped($k)."' AND";
}
if($ccc2==''){
$ccc2.= " product_sku RLIKE '".$db->getEscaped($k)."' AND";
}
else{
$ccc2.= " product_sku RLIKE '".$db->getEscaped($k)."' AND";
}
}
else {
$ccc2.= " product_sku RLIKE '0' AND";
$ccc.= " concat(product_name, customtitle) RLIKE '0' AND";
}
}
$ccc = rtrim($ccc, "AND");
$ccc2 = rtrim($ccc2, "AND");
$q ="(SELECT p.virtuemart_product_id, l.product_name
from #__virtuemart_products p join
#__virtuemart_products_".VMLANG." l
on p.virtuemart_product_id = l.virtuemart_product_id
WHERE ".$ccc." AND
p.published = '1'
LIMIT 0,".$prods."
)
union (select p.virtuemart_product_id, l.product_name
from #__virtuemart_products p join
#__virtuemart_products_".VMLANG." l
on p.virtuemart_product_id = l.virtuemart_product_id
where ".$ccc2." and
p.published = '1'
LIMIT 0,".$prods.")";
答案 0 :(得分:0)
据我所知......不可能使用MySQL。
如果你想要真正的模糊匹配,你需要一个专为它设计的搜索系统。 Lucene库对此非常有用,可用于一些令人惊叹的OSS项目。
这两个我推荐ElasticSearch。
答案 1 :(得分:0)
我很好奇如何回答同样的问题,虽然我对levenshtein不熟悉,但我发现这个问题与我的问题非常相似,并以有效的方法回答。
注意:其他状态说明这只适用于小数据搜索。因为它反复复合,你可以想象它可能是多么昂贵(CPU和内存)。
堆栈溢出参考 php (fuzzy) search matching
PHP文档: PHP:net levenshtein