2011-10-27 14 views
3

私は、一例として、以下のデータベーススキーマています:MySQLフルテキスト検索を使用して一部の単語を一致させますか?

CREATE TABLE IF NOT EXISTS `items` (
    `id` int(11) unsigned NOT NULL, 
    `irn` varchar(30) NOT NULL, 
    `name` varchar(225) NOT NULL, 
    `description` text, 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `name_desc_irn` (`name`,`description`,`irn`), 
    FULLTEXT KEY `name` (`name`), 
    FULLTEXT KEY `description` (`description`), 
    FULLTEXT KEY `irn` (`irn`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

、次のデータ(実際に、私は10万人以上のレコードを持って、簡素化され、ここでデータを想定)

id name  irn   description  
1  Widget A ABC12345  testing ABC12345 
2  Widget B ABC-12345 the ABC is great 

そして次クエリ:

SELECT 
    items.id as id, 
    items.irn as irn, 
    items.name as name, 
    (
     ((MATCH (irn) AGAINST ('12345')) * 5) + 
     ((MATCH (name) AGAINST ('12345')) * 4) + 
     ((MATCH (description) AGAINST ('12345')) * 3) + 
     (MATCH(name, description, irn) AGAINST ('12345')) 
    ) AS relevance 
FROM 
    items 
WHERE 
    MATCH(name, description, irn) AGAINST ('*12345' IN BOOLEAN MODE) 
HAVING 
    relevance > 0 
ORDER BY 
    relevance DESC 

2番目の結果(ABC-12345のirn)は返されますが、最初の結果(ABC12345)は返されません。なぜそれはABC12345と一致しませんが、ABC-12345と一致しますか? Fulltext検索を使用して両方を一致させる方法はありますか?そうでない場合は、12345を検索するときにABC12345とABC-12345の両方が見つかった場合、このタイプの検索を実行する最も適切な方法は何ですか?

答えて

2

*ブール型フルテキスト検索演算子であなたに与えられる唯一の情報は、MySQL Manualによれば、「他の演算子とは異なり、影響を受ける単語に追加する必要があります。

クエリのこの特定のタイプのための唯一のオプションのようなものにあなたのwhere句を変更することがあるかもしれない

WHERE irn LIKE '%12345' OR name LIKE '%12345' OR description LIKE '%12345' 
関連する問題