分布式实时搜索方案介绍-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 {
- @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中的写入:
- <column name=“hot_id” type=“long” />
- <column name=“user_id” type=“long” />
- <column name=“type” type=“int” />
- <column name=“subject” type=“sring” />
- <column name=“contents” type=“text” index=“ANALYZED” store=“YES” termvector=“YES” />
- </table>
可供选择的其他分布式实时搜索方案 Katta:基于Lucene可伸缩分布式实时搜索方案,最早的方案。
Solandra:实时分布式搜索引擎,把solr与Cassandra集合在一起的一个方案。
原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
Posted by 54chen 架构研究