2014-04-06 34 views
1

我還沒有找到答案,也許我忽略了它,但這是一個非常簡單的問題:PHP MySQL的搜索查詢 - 如何找到導致像「我的搜索」搜索「MYSEARCH」的時候?

我有一個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

據我所知....無法與MySQL。

如果你想真正的模糊匹配,你需要爲它設計一個搜索系統。 Lucene庫對此非常有用,用於一些令人驚歎的OSS項目。

退房ElasticSearchSolr

兩個

我建議ElasticSearch

+0

謝謝,這是我所擔心的。我會研究你發佈的鏈接,也許我可以使用其中一些庫。 – GeniusDesign

0

我很好奇,怎麼回答你同樣的問題,雖然我不熟悉萊文斯坦,我發現這個問題,我相信這是你的差不多,用的有效途徑回答。

注:其他國家,這是小數據只搜索確定。因爲它會反覆複合,所以您可以想象它可能會花多少錢(CPU和內存)。

堆棧溢出參考 php (fuzzy) search matching

PHP文件: PHP:net levenshtein

+0

謝謝Shaun。我會研究這一點。不幸的是,這個搜索模塊所使用的應用程序是一個超過200個類別和3000個產品的網上商店,因此它必須是輕量級的 – GeniusDesign