0

私のアプリケーションでは、MySQL クエリを使用しています。

SELECT DISTINCT * FROM forum_topic \
        LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \
            WHERE MATCH (forum_post.content) AGAINST ('searching text') \
        AND !MATCH (forum_topic.topic_name) AGAINST ('searching text') \
        GROUP BY forum_topic.Id

しかし、今は Sphinx に移行したいと考えています。DB に構成ファイルとテーブル sph_counter を作成しました。今、私の設定は次のようになります:

source main
{
    type            = mysql
    sql_host        = localhost
    sql_user        = root
    sql_pass        =
    sql_db          = sphinx
    sql_port        = 3306  # optional, default is 3306
        sql_query_pre = SET NAMES utf8
        sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(Id) FROM forum_post
        sql_query = SELECT * FROM forum_topic LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \
            WHERE forum_post.Id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
            AND MATCH (forum_post.content) AGAINST ('searching text') \
            AND !MATCH (forum_topic.topic_name) AGAINST ('searching text')
            GROUP BY(forum_topic.Id)

    sql_attr_uint = id_topic
}

source delta : main
{
    sql_query_pre = SET NAMES utf8
    sql_query = SELECT * FROM forum_topic LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \
            WHERE forum_post.Id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
            AND MATCH (forum_post.content) AGAINST ('searching text') \
            AND !MATCH (forum_topic.topic_name) AGAINST ('searching text')
            GROUP BY(forum_topic.Id)
}

index main
{
    source = main
    path = /var/data/main_sphinx
    charset_type = utf-8
}
index delta : main
{
    source = delta
    path = /var/data/delta_sphinx
    charset_type = utf-8
}

Sphinx で検索するのは正しい方法ですか? または、PHPスクリプトからこれを行う必要がありますか?

4

1 に答える 1

0

構成ファイルに「クエリ」を入れないでください。スフィンクス インデックスにすべてのドキュメントを含める必要があります。Sphinx はクエリをオフラインで実行し、結果にインデックスを付けます。次に、Sphinx はそのインデックスに対してクエリを実行します。

だからあなたは実際に次のようなものが欲しい

    sql_query = SELECT p.*,t.* FROM forum_post p INNER JOIN forum_topic p ON p.id_topic = t.Id \
        WHERE p.Id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )

GROUP BY id_topic はお勧めしません。これは、トピックごとに 1 つのドキュメントを意味するためです。つまり、sphinx はスレッドごとに 1 つの投稿しか表示しないため、ほとんどのトピックは検索できません。

テーブルも移動したので、Posts が最初です。そのため、sphinx の document_id (SELECT リストの最初の列) が post_id になります。これが一意であるためです。

トピックIDを属性として持っているので、必要に応じてスフィンクスでグループ化できます。

これで、このインデックスを使用してインデクサーを実行し、すべてのドキュメントにインデックスを付けることができます。

次に、インデックスに対してクエリを実行します(「検索テキスト」の例のように):

$cl->setMatchMode(SPH_MATCH_EXTENDED);
$res = $cl->Query('@content searching text','index');

このようにして、1 つのインデックスを構築し、それに対して任意のクエリを実行します。

(@content 構文を使用すると、検索して作成者から除外するのではなく、バターであ​​るクエリで content 列のみを検索することを意味します。

于 2012-11-30T13:58:12.013 に答える