lucene codec是如何集成的

From Evernote:

lucene codec是如何集成的

lucene 4.0 后整体结构上一个最大的变化就是用户可以写各个codec,为扩展提供了极大的便利。

1. 那整体设置上是如何的呢?切入点是在哪里

codec

2. codec中使用哪些实现,通过

SPI(service provider interface) 来实现。

http://en.wikipedia.org/wiki/Service_provider_interface

3. codec 又是怎样初始化的呢? 也就是说如何配置使用哪个codec

    理解下spring的bean配置,可能会想到是否也利用同样的机制来配置决定使用哪个codec呢?

    同时再思考下,我们有时是不是经常对某一变量先new 一个default value,但同时又提供一个set方法,

     好让外界有机会根据自己的需要来modify这个value。

    没错,其实我们平时在用的这一套方法论也同样适用lucene中如何引用codec。

   对于Codec的总入口类 Codec,提供了一个获取default codec的方法:

  ……

 private static Codec defaultCodec = Codec.forName(“lucene41″);

  …….

  public static Codec getDefault(){

     return defaultCodec;

    }

spi实现的简单解释:

在resources目录下,创建 

完整classname的文件,

文件中内容是文件名对应接口的实现类,

在这个例子中就是各个不同版本的codec实现类。

目前的实现如果想升级某类field的format,必须升级整个codec,不能单独为一个field进行配置

   

一周回顾(13.1.21–1.27)

2013-01-21—–2013-01-27

技术:

  1. 本周技术上最关心的倒是lucene4.1 release了,其中几个主要的特性是:
                 1) 默认的codec改成了Lucene41Codec
                       2) 引进了 针对stored field 的新压缩技术:lz4
                              具体可见:http://blog.jpountz.net/post/33247161884/efficient-compressed-stored-fields-with-lucene
                      3) Lucene no longer seeks when writing files (all fields are written in an append-only way). This means it works by default with append-only streams, hdfs, etc. 
                      其它highlight可见:
                        http://blog.mikemccandless.com/2012/09/lucenes-new-analyzing-suggester.html
 
综合:
 
 
          

美股之旅

去年的时候,往美股账户里打了2100$。当时玩美股的一个思路就是:不是XX公司的员工,但我可以是其股东,哈哈。

开始时关注的股票有360, facebook。但可惜的是当它们在20以下时,委托了后没有买进来。后续只能看着他们一路往上涨。对此自己的总结是:执行不到位,不按既定目标执行是最大败笔。当facebook在19以下时,自己觉得是可以入手(唯一的判断标准就是股价快腰斩了),但在实际操作时,总希望买的更低一点,委托价偏低。

在这个月,入手了yy,价格为13.6。

Guava之eventBus

这是对自己之前在工作中一实现和EventBus 实现的差距分析

业务场景:
      在系统中经常会有一个component产生一份数据,在完成自己的业务时,还需要交给另外的component进行一些额外的处理。这其实已经是publish-subscribe-style communication。
      在love中类似的场景是有:
     1) 用户发表了一个宝贝,在完成所有发表相关操作后,还需要实时分析检测模块来确定当前发表的宝贝是否需要在前台展现,如果没有这模块的话,发表的推广宝贝在增量更新后马上在前台最近列表下展现出来。
     检测分为两种,用户分享的宝贝是不是大部分是来自同一店铺 ,分享宝贝的理由是不是广告信息。
     2)用户对宝贝,专辑进行评论。在完成评论后,也需要一个模块来分析当前评论是否是垃圾评论,如果是的话,直接将这评论实时删除。
     应该说还有其它类似的业务需求都可以归类为publish-subscribe。

做publish-subscribe这样的体系结构可以分为两个层面:
1)系统之间的,这时我们可以采用notify来完成
2)系统内component之间的, 可以自己通过队列来完成

在有些场景下,我们可以把系统间的publish-subscribe弱化成系统内component之间的。如场景1),2),我们可以另外搭建一个应用,通过notify来传递信息,辅以一个中心存储点,也可以直接在单台jvm内完成。

ugly的实现:

思路:利用queue来交换数据。

交换容器:
/**
* size在写入时控制,防止oom
*/
ConcurrentLinkedQueue<InfoDO> infoQueue = new ConcurrentLinkedQueue<InfoDO>();

添加入口(publish):
public boolean add(InfoDO infoDO) {
    ……. info本身事先分析,过滤
result = infoQueue.add(copyInfo);
return result;

}

consume机制:
起一个线程,不停地扫queue中的数据
class AnalysisThread extends Thread {

@Override
public void run() {

while (true) {

                             …………………….
                     if (infoQueue.isEmpty()) {

try {
Thread.sleep(SLEEP_TIME);

} catch (InterruptedException e) {
logger.warn(“AnalysisContainer-Exception-info:{}”, e);

}
continue;
}
InfoDO info = infoQueue.poll();
if (info != null) {
try {
sameShopAnalysis.analysis(info);
} catch (Throwable t) {
logger.warn(“AnalysisContainer-analysis-info:{}”, t);
}

………………
}

这里的sameShopAnalysis是作为一个property注入进来的,
当有其它类型数据需要分析时,需要注入新的bean,并且overwrite  add()接口,同时需要修改while(true)中的代码。
所有这些为的都是这个异步线程能及时描述到新增的数据,同时拿出来后交给对应compoent中处理此业务的bean。

优点:
在一定程度上已经隔离了两个component之间的相互感知,只需要通过所有publish端只需要调用 AnalysisContainer 的add接口。

存在的改进点:
这个Analysiscontainer没有共用性,每次新增数据类型时,得改动这里的代码。这个只能是最简单版本的publish-subscribe。

改进思路:
需要做的是把这个dispatch统一掉,形成一个公共的类,对数据类型,subscribe(consumer)透明。

EventBus是如何设计的:

The EventBus system and code use the following terms to discuss event distribution:

Event (类似于AnalysisContainer) Any object that may be posted to a bus.
Subscribing(类似于property中各个初始化的Analysis进行赋值) The act of registering a listener with an EventBus, so that its handler methods will receive events.
Listener(类似于sameShopAnalysis,各个分析bean) An object that wishes to receive events, by exposing handler methods.
Handler method(类似于analysis接口中的analysis()方法) A public method that the EventBus should use to deliver posted events. Handler methods are marked by the Subscribe annotation.
Posting an event(类似于AnalysisContainer中的add()方法) Making the event available to any listeners through the EventBus.

因为在AnalysisContainer中,是通过hard code将Event和Listener关联在一起的,如果要想去掉hard code,就需要定义一定的规则,并且利用通过的技术手段关联起来。

Listener实现:
1) 突破了 Analysis的接口实现约定(因为是硬编码,其实可以不遵守接口实现),可以是任何bean,但需要通过 @Subscribe 这个annotation来指明想让bean中哪个方法来receive Event。
Suscribing:
1)在目前的实现中,是通过property new一个新值 ,赋值操作完成。
  在EventBus中,通过register()方法来完成。但在这register过程中,会分析这个bean中哪些方法使用了@Subscribe , 如果使用了,则提取出这个方法,并且分析第一个参数bean的 接口,类集合(the set of interfaces and classes that this type is or is a subtype of).
   这是很关键的一个设计,当有Event 提交时,就是根据Event的 接口,类集合 来匹配这些参数的接口,类集合,再进一步找到对应 handler及方法。

系统中的改进:

因此可以拿掉系统中那ugly的AnalysisContainer代码,
替换成EventBus, 将每个analysis接口的实现类register进来,同时使用@Subscribe来指明handler method。

注意点:
因为分析还是相对比较耗时,
When post is called, all registered handlers for an event are run in sequence, so handlers should be reasonably quick. If an event may trigger an extended process (such as a database load), spawn a thread or queue it for later. (For a convenient way to do this, use an AsyncEventBus.)  

10月学习汇总

10月份没写一篇blog,现在又是11月中旬了,想了想还是写点10月总结吧。列一下自己在10月份关注了哪些技术点,看了哪些资料。做事贵在坚持啊。

1) 10月关注技术中,最主要的是lucene 4.0 发布了。针对4.0的代码阅读只进行了一部分,store和document这两个package。画了些类结构图,随手写了些代码理解。以目前的工作强度来看,要在12月完成所有代码阅读,写完对此的理解还是很很大困难。目前几乎所有时间都被12.12的开发所占据。

2)在10月阅读的书籍主要是 <<统计学习方法>>,这其实是每Q一书计划中Q3的阅读书目。

经过以上两条一总结,感觉自己很多任务都是一直在往后delay啊。

9月份总结

投资:

1)本月初时,将豫光金铅几乎在最低点割掉,但随便进行了大幅反弹,错失一次机会。

2)本月将00700腾讯在256.7出掉了,相对8月份买入时的卖出目标价(251)也还是可以了,最近还在创高。不过我是要等它再跌回去再买回来了。因为这个利润点已经比一年的利息好多了。

 

技术:

技术上没有特别的关注点啊,对于lucene4.0,也只看了部分代码。

一周回顾

  1. http://news.imeigu.com/a/1346974260413.html    9.6日消息: eBay收购Pinterest竞争对手Svpply、
  2. Lisbon Machine Learning School  提供的:http://lxmls.it.pt/2011/Schedule.html 。Koby Crammer、Jason Eisner、Noah Smith、Slav Petrov等横跨ML和NLP的牛人们深入浅出地介绍自然语言处理里中的机器学习算法,讲义可以免费下载。信息来自:刘知远THU

8月投资总结

http://blog.maidou.info/2012/08/%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%90%9E%E4%BA%86%E7%82%B9%E6%B8%AF%E8%82%A1/

当时定的目标是250的时候卖掉,在8月份最达到最高点的那一天,挂了252,不过因为时间上原因没有match成功,谁知道后面一直在跌,而自己还是没有遵守之前定下的规则,因为错过了252,一直想等再次回到这价格。

贪婪再次给自己上了一课,目前的价格又回到了237。

一周微博回顾(8.27-8.31)

2012.8.27-20128.31

哈哈,第一次列这些玩意儿,还是以技术为主吧。

1.  Webp 的图片格式开始在淘宝手机端使用

  关于webp,随便一google就知道了啊: 

http://en.wikipedia.org/wiki/WebP

https://developers.google.com/speed/webp/

 WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. 

看了这介绍,你心动吗?

对于大互联网公司来说,一个小点上的技术改进都可能带来很大的效益。

之前也尝推进google protobuf在公司某核心场景的使用,如果用钱来算的话,也是可以节省不少的,哈哈。

2.  MIT最大流搞出O(nm)的算法了, 

 http://jorlin.scripts.mit.edu/Max_flows_in_O%28nm%29_time.html

3.   如何从按键音中听出360总裁@周鸿祎 的手机号码【全文】

http://www.vjianke.com/board/b5e51221f40e42489627af17814aae89.clip#ZQ0YL

 

对自己来说,花点时间了解下webp,学习把 那nb算法,对于第3点只好是膜拜了,哈哈。