sphinx中聚类统计的实现与数据表设计

[b]开场白:[/b]sphinx是一个简单但功能相当强大的基于mysql的一个搜索插件包.
1 搜索速度方面稍比lucene快,索引分词速度上也比lucene的分词工具如:IK,paoding等快.(个人平时实践而言)
2 内存搜索与CPU占用方面,比lucene要控制得好.
3 灵活性明显比lucene要差,因为索引字段一定要基于数据库的字段,不能象lucene一样可以随时建立索引的字段.
4 不能象lucene一样只要继承Similarity就可以重写lucene排序的方法,即,关于排序的功能不如lucene好.

[b]开始:[/b]这次我们讨论的不是讨论sphinx上的搜索,只是讨论聚类方面的实现.包括于mysql的表设计.
现在举一个例子:
现在有一个表,记录了包括各个分组的名称,结构如下
[b]table person_info[/b] 个人信息
[img]http://kernaling-wong.iteye.com/upload/picture/pic/59411/1a19369e-ba81-391f-a68a-84ab324ff6ae.jpg[/img]

[b]table group_mapping [/b]分组映射表
[img]http://kernaling-wong.iteye.com/upload/picture/pic/59413/ef580928-a12d-3bd9-a28b-17d99eab2b5d.jpg[/img]


记录了每一个分组的名称与分组的Id,同时person_info 中的分组Id都是基于 group_mapping 中的分组名称对应的Id.这样做是因为sphinx中不能直接保存数据的内容.所以如果对分组的中文进行分组,则返回的不是字段内容,而是一串数字,所以要用这样的groupId来表示分组,这样sphinx在建立索引的时候可以用数字作为建立索引了.
[img]http://kernaling-wong.iteye.com/upload/picture/pic/59399/b5768ed6-2e85-3453-9a3e-9c10d9e1b576.jpg[/img]
当我们对person_info做完索引的时候,可以启动sphinx提供的java接口的程序,来查询,当然我这里只是提供聚类的搜索,其实就是类似于 sql 语句的 group by .这可以实现了,
我们以刚才需要做聚类统计的字段 groupId 作为了group by 的条件.注意,比如现在输入某一个关键字来搜索的时候,同时也选择了某一个聚类的条件,搜索条件需要是这样的
[b] @info 关键字 @groupIdVar 3[/b]
它的意思是指定了搜索字段,我们现在是用SphinxClient.SPH_MATCH_EXTENDED这种模式下搜索.大家会问,为什么聚类统计就是用groupId字段,但是搜索的要用groupIdVar呢?这样不是多此一举吗?直接搜索groupId就可以了吧...经过实践,发现,在搜索指定的字段方面,只能搜索是varchar类型的字段,而groupId却是一个int类型的,所以才会把表设计成相同的数值但不同的类型的原因了.总结就是.groupId是用来作聚类统计,groupIdVar则是用来指定搜索的.数值是一样,只是类型不相同.
OK,现在我们看看效果吧.可以看到,我们整一个person_info表中groupId只有四种,groupId=1,2,3,4
[img]http://kernaling-wong.iteye.com/upload/picture/pic/59409/45bcb0d7-b938-30a7-9e5c-f3ad83564210.jpg[/img]
同时每一聚类的数量都由@count表示出来了,这样就实现了聚类了,同时如果按照聚类去搜索则可以以 @groupIdVar 聚类Id 就可以了.
[img]http://kernaling-wong.iteye.com/upload/picture/pic/59407/e867f485-baf7-34d8-89a8-0633b6a037d8.jpg[/img]
可以看到搜索出来的全部都是以groupId=3的.

[b]结论:[/b]coreseek以shpinx作为了对中文的支持,是大数据量的搜索提供了非常好另一个解决方案.不过个人认为coreseek其实可以完全脱离mysql而存在,这样可以使用sphinx使用更灵活,同时shpinx特别适合于一些对数据格式化不多的搜索应用.以上文章难免有错误之外,如有发现请欢迎随时提出.
欢迎连载,请注意出处 http://kernaling-wong.iteye.com/blog/642135 by kernaling.wong
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值