`
SimonLei
  • 浏览: 176153 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Search ClassBridge来解决附件同步索引的问题

阅读更多

我有个类 Issue,但是它的附件并不放在数据库当中,而是放在某个目录下。
这时候,我想让 hibernate search 能够自动的把这个类的附件也一并建立
索引,检索的时候能够针对附件进行检索。

刚开始用很土的办法,在 Issue类里面增加了一个 attachContent 的clob字段,
用来存放从文件中抽取出来的内容,然后在 hibernate 的 preInsert/preUpdate
拦截器当中,扫描附件文件,抽取其中的内容,然后set到 attachContent 属性中,
这样就可以达到目标了。

虽然这样已经可以工作了,但是总是感觉不好。首先,attachContent这个字段比较
恶心,完全没必要存在的,影响selct效率。其次,这个拦截器也感觉很不好,把一
个动作分散在好几个地方,而且每次update的时候都重新扫描,影响效率。

搜了一下,偶尔发现了一个 FieldBridge的接口, 就是 hibernate search里面用来对
field 进行custom索引的接口,然后又发现同一个package下面还有个 ClassBridge 的
Annotation。对 Issue 类设置 ClassBridge,然后自己做了一个类,来达到我的目标。

 

@Entity
@Indexed
@ClassBridge( impl = IssueClassBridge.class)
public class Issue {

 

IssueClassBridge 实际上是一个FieldBridge:

public class IssueClassBridge implements FieldBridge {

	@Override
	public void set(String name, Object obj, Document doc, Store store, Index index, Float boost) {
		try {
			Issue issue = (Issue) obj;
			AutoDetectParser parser = new AutoDetectParser();
			StringWriter writer = new StringWriter();
			Metadata metadata = new Metadata();
			File file = new File( issue.getAttachFilePath);
			FileInputStream is = new FileInputStream( file);
			parser.parse( is, new BodyContentHandler(writer), metadata);
			is.close();
			
			Field field = new Field("ALL", writer.toString() + " " + metadata.toString(), store, index);
			doc.add( field);
		} catch ( Throwable e) {
			System.out.println( "Error: " + obj + " " + e.getMessage() ); 
		}
	}

}

 

其中用 lucene 的 tika 来对附件的内容和 meta信息进行抽取。这样基本上只要在 Issue类上设置一下就ok了,

没有任何其他的设置工作,比较简单。当然,还可以判断一下是否需要index,如果附件没有变化,就不用重新index了。

 

 

1
0
分享到:
评论

相关推荐

    java开源包1

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包11

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包2

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包3

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包6

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包5

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包10

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包4

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包8

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包7

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包9

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包101

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    Java资源包01

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    JAVA上百实例源码以及开源项目源代码

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分...

Global site tag (gtag.js) - Google Analytics