2012-01-31 4 views
2

疑問があります。検索では、アポストロフィと検索結果が表示されますが、アポストロフィを使用しないで同じフレーズを検索した場合、検索結果には表示されません。アポストロフィが付いていない検索語(アポストロフィがある)

例:

検索:1

検索:スミスの猫はかなり 結果である鍛冶猫はかなり 結果である:人々が検索したときつまり0

、私がいることを必要とします"スミスの猫はきれいです"、また結果を表示する、このタイプの検索のためにSQLで行うことはできますか?

申し訳ありません。ご協力いただきありがとうございます。あなたは特殊文字を切り取ってみてくださいし、検索を実行することができ

+1

をよく読んで、MySQLを想定すると

は、PHPの文字列で同様のデータについては、この探索している、または中データベース?前者の場合、levenshtein() - http://uk.php.net/manual/en/function.levenshtein.php - またはmetaphone() - http://uk.php.net/manual/ja/を使用することを検討してください。 function.metaphone.php - functions –

+0

データベースにあります。ありがとうございます。 – cabita

答えて

1

(例えば例えばstr_replace("'", "", $str)何もすべてapostrpohesをstr_replace)

は、検索のために仕事をするなら、それはです。

+0

あなたの助けてくれてありがとうございます。アポストロフィなしで言葉を書いても結果が表示されず、アポストロフィで結果を出すだけです。str_replaceを適用できますが、結果は表示されません。 – cabita

+0

あなたの英語を理解するのが少し難しいです。問題を理解できるようにいくつかのコードを投稿しますか? –

+0

OPがデータベース内に持つものは 'Smith's'だと思っています。彼は検索用語として' smiths'を使用した場合、結果を望んでいます。 –

2

検索クエリからアポストロフィを削除するだけでよいでしょう。

あなたが作る場合:

$search_query = str_replace("'", '', $search_query); 

を、スクリプトの残りの部分は幾分次のようになります。もちろん

$words = explode(' ', $search_query); 
foreach($words as $word) 
{ 
    $pos = strpos($text_to_search, $word); 
    if(is_int($pos)) 
    echo 'found word {$word} at position {$pos}; 
} 

を、あなたはあなたの現在のコードについてもう少し情報を提供することができれば、それは良い:)あなたがここにあなたの現在のスクリプトを貼り付けることは可能ですか?

0

これが最善の方法であるかどうかはわかりませんが、過去に検索を設定した方法は、検索には何が含まれていても、データベースに「茎」フィールドを格納することです。私はその後、

<?php 
class Cleaner { 

    var $stopwords = array(" find ", " about ", " me ", " ever ", " each ", " update ", " delete ", " add ", " insert ", " where ", " i ", " a ", " my ");//you need to extend this big time. 

    var $symbols = array('/','\\','\'','"',',','.','<','>','?',';',':','[',']','{','}','|','=','+','-','_',')','(','*','&','^','%','$','#','@','!','~','`'); 

    function parseString($string) { 
     $string = ' '.$string.' '; 
     $string = $this->removeStopwords($string); 
     $string = $this->removeSymbols($string); 
     return $string; 
    } 

    function removeStopwords($string) { 
     for ($i = 0; $i < sizeof($this->stopwords); $i++) { 
      $string = str_replace($this->stopwords[$i],' ',$string); 
     } 

     //$string = str_replace(' ',' ',$string); 
     return trim($string); 
    } 

    function removeSymbols($string) { 
     for ($i = 0; $i < sizeof($this->symbols); $i++) { 
      $string = str_replace($this->symbols[$i],' ',$string); 
     } 

     return trim($string); 
    } 
} 

:私はそれがないすべての特殊文字を取り除くで、このクラスを介してデータを渡す、と私は検索に含めたくない特定の単語のリストをきれいにするには

an implementation of the porter stemmer algorithmを使用して単語を分岐させます。

検索する際に、検索語を絞り込み、データベース内のクリーン/ステミングされた単語のリストと比較する必要があります。おそらく、SELECT * FROM search WHERE keyword LIKE '%$stem%'のような単純なもので十分でしょう。

これは、たとえば「大胆」を検索した場合は「dar」になり、「あえて」と「あえて」と同じ結果が得られることを意味します。

は=もそれにすべてのことを説明するが、あなたが始めるためにうまくいけばthatsの十分な情報ではないかもしれません)

1

データベースで検索している場合は、フルテキストインデックスを使用して検討すべきです。

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

特に

http://dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html

+0

あなたの答えをありがとう。解決策かもしれませんが、私はそれを見直しますが、私にとって理解するのは少し難しいようです。 – cabita

+0

私は次のように入力します:SELECT * FROM 'employees'と(lastname)が一致する場合は(" smith "in NATURAL LANGUAGE MODE)、SELECT * FROM' employees' )、結果を表示しない(結果が表示されません) – cabita

+0

MySQLのバグでこのエントリをお読みくださいリスト - http://bugs.mysql.com/bug.php?id=14194とMySQLを実行していることを確認する> = 5.1.6 –

関連する問題