在Hibernate Search中反向搜索

时间:2010-04-16 08:43:22

标签: java hibernate lucene hibernate-search

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

我已经看到Lucene MemoryIndex Class在内存中创建一个索引,所以我可以对列表中的每个查询执行类似这样的示例(尽管在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 Search Annotations @ Field,@ IndexedEmbedded,...表示应该如何索引字段,所以当我在FullTextEntityManager实例上调用index()方法时,它使用这些信息来索引目录中的对象。是否有类似的方法使用此信息在内存中索引它?

是否有更有效的方法进行反向搜索?

2 个答案:

答案 0 :(得分:4)

只需为新对象建立索引(如果使用自动索引,除了提交当前事务之外不必执行任何操作),然后检索要运行的查询并在布尔查询中运行所有这些查询,并将所存储的内容组合在一起使用新对象的id进行查询。像这样:

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

如果您得到结果,则表示查询已匹配。

答案 1 :(得分:0)

由于MemoryIndex是一个完全独立的组件,不会扩展或实现Lucene的Directory或IndexReader,我认为没有办法将其插入Hibernate Search Annotations。我猜你如果选择使用MemoryIndex,你需要编写你的addField()调用,它基本上反映了你在注释中所做的事情。

我们在这里谈论了多少个查询?根据Hibernate维护的主索引上的查询运行,您可能能够逃脱的数量取决于您确定将搜索限制为刚刚添加的文档ID。或者对于添加的每个文档,使用RAMDirectory创建单文档内存索引并运行查询。