3

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

我已经看到 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 Search Annotations @Field,@IndexedEmbedded,... 这表明应该如何索引字段,所以当我在 FullTextEntityManager 实例上调用 index() 方法时,它使用这个信息来索引对象在目录中。是否有类似的方法可以使用此信息在内存中对其进行索引?

有没有更有效的方法来进行这种反向搜索?

4

2 回答 2

5

只需索引新对象(如果您使用自动索引,除了提交当前事务之外,您无需执行任何操作),然后检索您要运行的查询并在布尔查询中运行所有这些查询,将存储的查询与新对象的 id。像这样的东西:

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

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

于 2010-11-13T11:08:47.700 回答
0

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

我们在这里讨论了多少个查询?根据有多少,您可能只需在 Hibernate 维护的主索引上运行查询,确保将搜索限制在您刚刚添加的文档 ID 上。或者对于添加的每个文档,使用 RAMDirectory 创建一个单文档内存索引并通过该索引运行查询。

于 2010-04-16T19:44:26.910 回答