休眠搜索中的反向搜索

Jav*_*avi 3 java lucene hibernate hibernate-search

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

我已经看到 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");
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是这个数据类有几个 Hibernate Search Annotations @Field,@IndexedEmbedded,... 指示字段应该如何被索引,所以当我在 FullTextEntityManager 实例上调用 index() 方法时,它使用这个信息来索引对象在目录中。是否有类似的方法可以使用此信息在内存中对其进行索引?

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

Har*_*rdy 5

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

...
BooleanQuery query = new BooleanQuery();
query.add(storedQuery, BooleanClause.Occur.MUST);
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST);
... 
Run Code Online (Sandbox Code Playgroud)

如果您得到结果,您就知道查询匹配。