`
kernaling.wong
  • 浏览: 77861 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

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

开始:这次我们讨论的不是讨论sphinx上的搜索,只是讨论聚类方面的实现.包括于mysql的表设计.
现在举一个例子:
    现在有一个表,记录了包括各个分组的名称,结构如下
  table person_info 个人信息


  table group_mapping 分组映射表



记录了每一个分组的名称与分组的Id,同时person_info 中的分组Id都是基于 group_mapping 中的分组名称对应的Id.这样做是因为sphinx中不能直接保存数据的内容.所以如果对分组的中文进行分组,则返回的不是字段内容,而是一串数字,所以要用这样的groupId来表示分组,这样sphinx在建立索引的时候可以用数字作为建立索引了.

当我们对person_info做完索引的时候,可以启动sphinx提供的java接口的程序,来查询,当然我这里只是提供聚类的搜索,其实就是类似于 sql 语句的 group by .这可以实现了,
我们以刚才需要做聚类统计的字段 groupId 作为了group by 的条件.注意,比如现在输入某一个关键字来搜索的时候,同时也选择了某一个聚类的条件,搜索条件需要是这样的
   @info 关键字 @groupIdVar 3
它的意思是指定了搜索字段,我们现在是用SphinxClient.SPH_MATCH_EXTENDED这种模式下搜索.大家会问,为什么聚类统计就是用groupId字段,但是搜索的要用groupIdVar呢?这样不是多此一举吗?直接搜索groupId就可以了吧...经过实践,发现,在搜索指定的字段方面,只能搜索是varchar类型的字段,而groupId却是一个int类型的,所以才会把表设计成相同的数值但不同的类型的原因了.总结就是.groupId是用来作聚类统计,groupIdVar则是用来指定搜索的.数值是一样,只是类型不相同.
OK,现在我们看看效果吧.可以看到,我们整一个person_info表中groupId只有四种,groupId=1,2,3,4

同时每一聚类的数量都由@count表示出来了,这样就实现了聚类了,同时如果按照聚类去搜索则可以以 @groupIdVar 聚类Id 就可以了.

可以看到搜索出来的全部都是以groupId=3的.

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

相关推荐

Global site tag (gtag.js) - Google Analytics