2009-09-13 15 views
1

ご挨拶、 私のウェブサイトで検索を実装する最良の方法について考えています。私はSphinxとMySQLのフルテキスト検索について知っていますが、ただ一つのフィールドを検索するだけではありません。PHP検索のタイトルとタグ

私は、記事のタイトルとその記事に関連付けられたタグの2つのことを検索したいと思います。

私が考えていたのは、タイトルからのキーワードとこの文字列の最後に追加された各タグを含む記事テーブルの別の列を定義することでした。

たとえば、記事タイトルが「ホームシネマを構築する方法」であり、タグが「DIY」、「技術」である場合、このフィールドは「ホームシネマDIY技術を構築する」でしょう。私はこのフィールドで検索を実行することができました。

このアプローチでは、タグが更新された場合、このフィールドも更新する必要がありますが、このフィールドが不正確または期限切れになる可能性があります。

これを行うより良い方法はありますか?

答えて

1

スフィンクスは複数の列に基づいて検索を行うことができます。各列に "重み"を定義することもできます。私はあなたがそれにこだわるべきだと思う。

+0

タグには記事と多対多の関係がありますが、問題はあります。スフィンクスはそれに取り組むことができますか? –

+1

私はスフィンクスがどんな関係でも動作することを確かめています。 – Eimantas

0

MyISAMのMySQLでは、テーブルの複数の列に対してフルテキスト検索を実行できます。

参照:

$search = 'how to do short circuit evaluation?'; 
$q = 'SELECT * FROM `table` WHERE MATCH(tags, title, description) AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)'; 
$r = mysql_query($q); 
//.. so on 

は、別のテーブルを行うには、一定の同期を必要とし、それはあなたのシステムのために、非常に面倒です。

あなたのタグは、多くの関係に多くであるので、あなたはそれらを取得し、あなたのタグのスフィンクスでの複数値の属性を使用したクエリに

$q = 'SELECT * FROM `table` WHERE'. 
    ' MATCH(tags, title, '. 
    '(SELECT GROUP_CONCAT(`tag`) FROM `tags`'. 
    'WHERE `ArticleID`='.(int)$ArticleID.')'. 
    ') AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)'; 
0

を組み合わせることができます。

MVAsを、または複数値の属性は、スフィンクスの文書ごとの重要な属性の1つです。 MVAを使用すると、すべてのドキュメントに値のリストを添付することができます。記事タグ、商品カテゴリなどに役立ちます。MVA属性のフィルタリングとグループ化(ただしソートはできません)がサポートされています。

http://www.sphinxsearch.com/docs/current.html#mva

+0

ええ、最初はそれはもののように見えましたが、MVAは整数だけです。 – danieltalsky

+0

必ずしもそうではありません。アイデアは、各固有タグを整数IDで表すことです。これを行うには、整数IDをそれぞれの一意のタグにマップするSQLテーブルを作成します。たとえば、タグ「Java」はtag_idが1、タグ「C++」がtag_idが2になります。タグ「Java」を後で使用すると、同じtag_idが再利用されます。 – geofflee

0

スフィンクス、Luceneの、そしてほとんどすべてのフルテキスト検索は、単一の分野に限定されるものではありません。実際、デフォルトでは、すべてのフィールドを検索し、指定されたフィールドをフィルタリングします。私は内部のMySQLの検索は素晴らしいとは思わない、スフィンクスとLuceneのプラグインははるかに良いです。