2012-11-30 49 views
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 
} 

这是我用斯芬克斯搜索的正确方法吗?或者我从PHP脚本执行此操作?

回答

0

你不把'查询'放在配置文件中。你希望狮身人面像索引包含你的所有文档。狮身人面像运行查询,离线和索引结果。然后Sphinx将针对其索引运行查询。

所以你actully要像

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 - 因为这将意味着每个主题一个文档。这意味着狮身人面像将只能看到每个帖子的一篇文章,因此大多数主题都不可搜索。

也搬过来了,所以帖子是第一位的。因此,狮身人面像document_id - SELECT列表中的第一列 - 是post_id--因为这是唯一的。

你有主题ID作为属性,所以如果需要可以在狮身人面像中进行分组。

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

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

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

这样,你建立一个索引,然后对其运行arbitary查询。

(使用@content语法,表示仅使用您的查询来搜索content列,而不是搜索,然后将其排除在作者之外。