54 CHEN

分布式实时搜索方案介绍-senseidb

linkedin 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的包。代码如下:

  1. public class IKAnalyzerFactory implements SenseiPluginFactory {
  2. @Override
  3. public IKAnalyzer getBean(Map<String, String> initProperties, String fullPrefix, SenseiPluginRegistry pluginRegistry) {
  4. return new IKAnalyzer();
  5. }
  6. }

将此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即可。

在具体业务中传入数据:

  1. Properties props = new Properties();

  2. props.put(“zk.connect”, “your zk server:2181”);

  3. props.put(“serializer.class”, “kafka.serializer.StringEncoder”);

  4. ProducerConfig config = new ProducerConfig(props);

  5. Producer<String, String> producer = new Producer<String, String>(config);

  6. int i = (int) (Math.random() * 10000);

  7. JSONObject jo = new JSONObject();

  8. jo.put(“thread_id”, i);

  9. jo.put(“hot_id”, i + 300);

  10. jo.put(“user_id”, i + 1000);

  11. jo.put(“type”, i);

  12. jo.put(“subject”, “这是一个标题” + index);

  13. jo.put(“contents”, index);

  14. System.out.println(i);

  15. String msg = jo.toString();

  16. // The message is sent to a randomly selected partition registered in ZK

  17. ProducerData<String, String> data = new ProducerData<String, String>(“hotTopic”, msg);

  18. producer.send(data);

  19. producer.close();

3.索引配置
conf/schema.xml文件中定义了两种结构,一个是table一个是facets。
table的column定义了每个字段。
如下的一个定义,配合了2中的写入:

  1. <column name=“hot_id” type=“long” />
  2. <column name=“user_id” type=“long” />
  3. <column name=“type” type=“int” />
  4. <column name=“subject” type=“sring” />
  5. <column name=“contents” type=“text” index=“ANALYZED” store=“YES” termvector=“YES” />
  6. </table>

可供选择的其他分布式实时搜索方案 Katta:基于Lucene可伸缩分布式实时搜索方案,最早的方案。
Solandra:实时分布式搜索引擎,把solr与Cassandra集合在一起的一个方案。

原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]

Posted by 54chen 架构研究