2.4、OSQA内Sphinx配置文件
接下来为我们的问题搜索写sphinx配置文件,我的配置文件如下:#源定义
source base_source
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = osqa
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query_info_pre = SET NAMES utf8
sql_range_step = 1000
sql_query =
}
#index定义
index base_index
{
path=
source = base_source #对应的source名称
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
#charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
ngram_len = 0
}
source search_question_source: base_source
{
sql_query_range = select min(id),max(id) from forum_node
sql_query = SELECT question.id, question.title, author.username, question.tagnames, question.body,\
GROUP_CONCAT(answer.body) as answer_bodies FROM forum_node AS question, forum_node AS answer,\
auth_user AS author WHERE answer.parent_id = question.id AND question.author_id = author.id \
And question.id >= $start and question.id < $end GROUP BY question.id
# sql_attr_uint = group_id #从SQL读取到的值必须为整数,we should add the number of answer
# and update date to rank these questions
# sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
}
source delta_search_question_source: search_question_source
{
sql_query_range = select min(id),max(id) from forum_node where added_at > DATE_FORMAT(NOW(),'%Y-%m-%d')
}
index search_question_index : base_index
{
source= search_question_source
path= /ROOT/sphinx/index/search_question
}
index delta_search_question_index : search_question_index
{
source= delta_search_question_source
path= /ROOT/sphinx/index/delta_search_question
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = /ROOT/sphinx/log/searchd_osqa.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = /ROOT/sphinx/log/searchd_osqa.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = /ROOT/sphinx/log/query_osqa.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
可以放在任何文件夹下 只要建索引的时候指定就好。比如我的是放在/ROOT/sphinx/conf/sphinx_osqa.conf,接下来建索引: indexer -c /ROOT/sphinx/conf/sphinx_osqa.conf --all –rotate
Base_index的警告可以忽略,然后启动守护进程 searchd–c /ROOT/sphinx/conf/sphinx_osqa.conf
到此,sphinx的服务端都已经弄好,守护进程searchd在9312端口等待客户端发query。可以简单测试一下 search–c /ROOT/sphinx/conf/sphinx_osqa.conf keywords。
2.5、Sphinx服务端配置的几个问题
Sphinx服务端配置已经完成,虽然自从diable掉mysqlfulltext之后就可以搜到问题,但是用的是Like %keyword%形式的请求。我们现在需要改的有三处:
在/forum/models/question.py
在Question类加入search = SphinxSearch(
index ='search_question_index',
mode='SPH_MATCH_ALL',
),自己根据需求配置,比如设置权重之类的。
加入sphinxsearch引用from djangosphinx.models import SphinxSearch
QuestionManager类加入queryset = Question.search.query(keywords)
将命中的id取出来存成list结构,比如,存到变量ids里,然后直接返回
return False,self.filter(id__in=ids)
这样就返回了命中的id的所有问题。当然这种in的方式如果ids的数据量小的时候还可以,大了之后也不行,所以,后续应该考虑分页的方式来呈现更多的结果。
当然,最终能在服务器端上看到已经有收到请求了,如下图所示:
至此,之前搜到不到关键词/tag的问题成功解决。也就是说,咱们的StackOverflow的原型OSQA已经搭建完成,接下来,便是一系列修改完善优化的工作。最后,可以在5月底之前正式上线,不出所料的话。欢迎有兴趣者加入,谢谢。
参考文献及相关链接
后记
从4月6日和几个朋友正式启动以来,到如今已快一月,尽管我们存在着很多的缺陷,业余时间完成+平均毕业一年+异地协调作战,但一切不足以成为阻碍我们的借口。感谢我的团队/朋友们的支持,特别是菠萝,chx/@,银河系,Damon及志伟。他们给了我足够多的支持和帮助。
非常欢迎在京的有意者加入我们:
熟练or精通前端开发(js/css/html,或熟悉jquery/ajax);
后端(熟练linux/python,或熟悉django框架或进行过web py开发),或有做过大型网站经验的;
上手快,快速自学/开发能力强,业余时间充足,做事专注且有毅力。 有意且具备以上任何一项技能,在京的业余时间充足且想做点事情的,欢迎随时加入我们(加入的唯一条件则是:在本地独自成功搭建OSQA),以造益天下更多人。我的联系方式如下:1、微博@博主July,http://weibo.com/julyweibo;2、邮箱:zhoulei0907@yahoo.cn。
OK,本文或本blog内任何文章有任何问题,欢迎随时不吝赐教/指正。谢谢,完。