在我的应用程序中,我正在使用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脚本中执行此操作?
答案 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语法,意味着只搜索带有查询的内容列,这不是搜索,然后将其从作者中排除。