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

但现在我想迁移到狮身人面像。我在 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 运行查询、离线和索引结果。然后,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 - 因为这意味着每个主题一个文档。这意味着 sphinx 每个线程只会看到一个帖子,因此大部分主题都无法搜索。

还移动了桌子,所以帖子是第一位的。因此 sphinx document_id - SELECT 列表中的第一列 - 是 post_id - 因为那是唯一的。

您将主题 ID 作为属性,因此如果需要,可以在 sphinx 中进行分组。

现在您可以使用此索引运行索引器,并对每个文档进行索引。

然后您对索引运行查询(例如您的“搜索文本”示例):

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

这样,您构建一个索引,然后针对它运行任意查询。

(使用@content 语法,意味着仅使用您的查询搜索内容列,即黄油,而不是搜索,然后将其从作者中排除。

于 2012-11-30T13:58:12.013 回答