分布式实时搜索方案介绍-senseidb
以下内容由 [五四陈科学院]提供
名词解释
zoie:由linkedin开源的建立在lucene之上提供实时索引的系统。它利用两 个内存索引一个硬盘索引来实现实时搜索。
bobo-browse:由linkedin开源的基于lucene的分类浏览搜索系统。
zookeeper:一个分布式的,开放源码的分布式应用程序协调服务,常用来做配置服务。
senseidb:开源,分布式,实时,半结构化的数据库(官方网站上如是说)。实际上是一个将zoie、bobo-browse、zookeeper整合起来,提供各种方便的使用办法的一个项目。项目目标是达到简单易用的分布式实时搜索系统。
kafka:由linkedin开源的高吞吐量的消息系统。
norbert:norbert是一个提供分布式集群服务的开发框架,具备集群管理功能,对开发简单的通信架构,易扩展能承受高吞吐量的框架。scala实现,java无缝使用。其原理是:netty+zookeeper+pb。
IKAnalyzer:中文分词较好用的一个。
lucene:这个不用说了。
使用senseidb
1.解决中文分词问题
senseidb支持在配置上进行自定义analyzer。
要做的事情就是,建立一个jar包,里面只要一个类即可,依赖IKA的包。代码如下:
- public class IKAnalyzerFactory implements SenseiPluginFactory<IKAnalyzer> {
- @Override
- public IKAnalyzer getBean(Map<String, String> initProperties, String fullPrefix, SenseiPluginRegistry pluginRegistry) {
- return new IKAnalyzer();
- }
- }
将此jar包放于sensei/conf/ext目录下,修改定义文件sensei.properties:
sensei.index.analyzer.class = 上述jar包的全packagename classname
2.使用kafka数据源
在senseidb中有个叫gateway的概念,定义了数据源(实时的写入删除等)。
修改定义文件sensei.properties:
sensei.gateway.class=com.senseidb.gateway.kafka.KafkaDataProviderBuilder
这个class存在于sensei-trunk/sensei-gateway,打包扔进conf/ext即可。
在具体业务中传入数据:
- Properties props = new Properties();
- props.put("zk.connect", "your zk server:2181");
- props.put("serializer.class", "kafka.serializer.StringEncoder");
- ProducerConfig config = new ProducerConfig(props);
- Producer<String, String> producer = new Producer<String, String>(config);
- int i = (int) (Math.random() * 10000);
- JSONObject jo = new JSONObject();
- jo.put("thread_id", i);
- jo.put("hot_id", i + 300);
- jo.put("user_id", i + 1000);
- jo.put("type", i);
- jo.put("subject", "这是一个标题" + index);
- jo.put("contents", index);
- System.out.println(i);
- String msg = jo.toString();
- // The message is sent to a randomly selected partition registered in ZK
- ProducerData<String, String> data = new ProducerData<String, String>("hotTopic", msg);
- producer.send(data);
- producer.close();
3.索引配置
conf/schema.xml文件中定义了两种结构,一个是table一个是facets。
table的column定义了每个字段。
如下的一个定义,配合了2中的写入:
- <table uid="thread_id">
- <column name="hot_id" type="long" />
- <column name="user_id" type="long" />
- <column name="type" type="int" />
- <column name="subject" type="sring" />
- <!-- attributes: indexed,store,termvector are only used when type is text -->
- <column name="contents" type="text" index="ANALYZED" store="YES" termvector="YES" />
- </table>
可供选择的其他分布式实时搜索方案
Katta:基于Lucene可伸缩分布式实时搜索方案,最早的方案。
Solandra:实时分布式搜索引擎,把solr与Cassandra集合在一起的一个方案。
想快点找到作者也可以到Twitter上留言: @54chen
或者你懒得带梯子上墙,请到新浪微博: @54chen