我们想在Hibernate数据库上启用全文搜索,只搜索特定实体的一些对象。有没有办法阻止hibernate search索引这个实体的一些实例?我们不想过滤搜索结果,我们只想让一些实例根本不被索引。
举个例子:我们有一个数据库,里面有在职和退休的员工。我们不需要能够搜索退休员工。我们是一家非常古老的IT公司,成立于1695年,因此我们有大约200万名退休员工,我们非常喜欢,但不想索引,只有10个活跃的。有没有一种方法可以告诉Hibernate Search只对退休= false的员工进行索引?
你好,Jochen
发布于 2011-09-28 15:35:45
我不认为你应该在你的事件监听器中直接使用IndexReader。相反,您应该扩展(或编写一个新版本)现有的,并在回调方法中检查您的实体,这取决于已停用的字段调用或不调用processWork。
如果你想使用Hibernate Search4(以及Hibernate Core4),你还需要一个定制的HibernateSearchIntegrator。
此解决方案是可行的,但在HSEARCH-471实施之前,应将其视为临时解决方案。
发布于 2011-09-27 22:34:52
您将需要一个PreUpdateEventListener,在此侦听器中,检查实体并确定是否要将其添加到lucene索引中。
这段代码不一定能正常工作,但希望您能理解。
public class LuceneUpdateListener implements PreUpdateEventListener {
protected FSDirectory directory; // = path to lucene index
public boolean onPreUpdate(PreUpdateEvent event) {
if (event.getEntity() instanceof Employee ) {
try {
Employee employee = (Employee) event.getEntity();
//Remove on update
remove((Employee) event.getEntity(), (Long) event.getId(), directory);
//Add it back if this instance should be indexed
try {
if (employee.shouldBeIndexed()) {
add((Employee) event.getEntity(), (Long) event.getId(), directory);
}
}
catch (Exception e) {
}
}
catch (Exception e) {
throw new CallbackException(e.getMessage());
}
}
}
return false;
}
protected synchronized void add(Employee employee, Id employeeId, FSDirectory directory) {
try{
IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), false);
Document d = LuceneDocumentFactory.makeDocument(employee);
writer.addDocument(d);
writer.close();
directory.close();
}
catch(Exception e) {
}
}
protected synchronized void remove(Long id, FSDirectory directory) throws IOException {
try {
IndexReader ir = IndexReader.open(directory);
ir.deleteDocuments(new Term("id", id.toString()));
ir.close();
}
catch(Exception e) {
}
}
public FSDirectory getDirectory() {
return directory;
}
public void setDirectory(FSDirectory directory) {
this.directory = directory;
}
}为了在hibernate事件之外索引这些对象,您可以从该类中提取逻辑,并批量处理您的员工。
另外,别忘了注册你的监听器。
https://stackoverflow.com/questions/7570122
复制相似问题