osqa java_从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA(召唤前端)

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的数据量小的时候还可以,大了之后也不行,所以,后续应该考虑分页的方式来呈现更多的结果。

当然,最终能在服务器端上看到已经有收到请求了,如下图所示:

1335977214_9066.png

至此,之前搜到不到关键词/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内任何文章有任何问题,欢迎随时不吝赐教/指正。谢谢,完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值