狮身人面像查询 - 正确的查询方式

时间:2012-11-30 09:36:46

标签: sphinx

在我的应用程序中,我正在使用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脚本中执行此操作?

1 个答案:

答案 0 :(得分:0)

你没有提出&#39;查询&#39;在配置文件中。您希望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每个帖子只会看到一个帖子,因此大多数话题都无法搜索到。

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

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

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

然后针对索引运行查询(例如您的搜索文本&#39;示例):

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

这样,您构建一个索引,然后对其执行任意查询。

(使用@content语法,意味着只搜索带有查询的内容列,这不是搜索,然后将其从作者中排除。