有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Hibernate搜索中的java反向搜索

我正在使用Hibernate搜索(它使用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搜索注释@Field、@IndexedEmbedded、,。。。它指示了字段应该如何索引,因此当我在FullTextEntityManager实例上调用index()方法时,它会使用此信息为目录中的对象编制索引。是否有类似的方法使用此信息在内存中对其进行索引

有没有更有效的方法进行反向搜索


共 (2) 个答案

  1. # 1 楼答案

    只需为新对象建立索引(如果使用自动索引,除了提交当前事务外,无需执行任何操作),然后检索要运行的查询,并在布尔查询中运行所有查询,将存储的查询与新对象的id结合起来。比如:

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

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

  2. # 2 楼答案

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

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