2010-04-16 95 views
2

我正在使用Hibernate Search(使用Lucene)来搜索某些已在目录中编入索引的数据。它工作正常,但我需要做一个反向搜索。通过反向搜索,我的意思是我有一个存储在我的数据库中的查询列表,我需要在每次创建数据对象时检查这些查询中的哪一个与数据对象匹配。我需要它在数据对象与他创建的查询匹配时提醒用户。所以我需要索引这个刚刚创建的单个数据对象,并查看我的列表中哪些查询将此对象作为结果。在Hibernate搜索中进行反向搜索

我见过的Lucene MemoryIndex类在内存中创建一个索引,所以我可以在列表中的每个查询这样做例子(尽管在查询中的一个Java迭代名单不会是非常有效的):

//Iterating over my list<Query> 
MemoryIndex index = new MemoryIndex(); 
//Add all fields 
index.addField("myField", "myFieldData", analyzer); 
... 
QueryParser parser = new QueryParser("myField", analyzer); 
float score = index.search(query); 
if (score > 0.0f) { 
    System.out.println("it's a match"); 
} else { 
    System.out.println("no match found"); 
} 

这里的问题是,这个数据类有几个Hibernate搜索注释@字段,@ IndexedEmbedded,...这表明字段应该如何索引,所以当我调用FullTextEntityManager实例上的index()方法时,它使用这些信息索引目录中的对象。有没有类似的方式来使用这些信息在内存中索引它?

有没有一个更有效的方法来做这种反向搜索?

回答

4

只是指数的新对象(如果您使用自动索引你没有做任何事情,除了提交当前的事务),然后检索要运行和运行所有的人都在布尔查询的查询,结合存储的查询与新对象的ID。这样的事情:

... 
BooleanQuery query = new BooleanQuery(); 
query.add(storedQuery, BooleanClause.Occur.MUST); 
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST); 
... 

如果你得到一个结果,你知道查询匹配。

0

由于MemoryIndex是一个完全独立的组件,不扩展或实现Lucene的目录或的IndexReader,我不认为有你可以插入到这个Hibernate Search的注解的方式。我猜如果你选择使用MemoryIndex,你需要编写你的addField()调用,它们基本上反映了你在注释中做什么。

我们在这里讨论了多少个查询?取决于你可以通过在Hibernate所维护的主索引上运行查询来获得多少个查询,以确保将搜索限制为刚刚添加的文档ID。或者,对于添加的每个文档,使用RAMDirectory创建一个单文档内存索引并通过它运行查询。