2012-11-30 87 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列,而不是搜索,然後將其排除在作者之外。