Lucene TwoWayFieldBridge slow query



我已经在lucene中构建了一个查询来替换SQL查询,但得出的结论是lucene查询慢了一个多数量级。我的意思是,从 250 毫秒到 5000 毫秒,所以不可接受的。设置有点特殊,我想这就是问题所在。

正在索引和搜索的主字段属于 Map<String, String> 类型,映射如下:

@ElementCollection(targetClass = String.class) @CollectionTable(name = "data") private Map<String, String> data;

或者换句话说,此实体具有与键值对关联的表。我们希望搜索这些值,但仅限于特定键。因此,如果我们遇到满足我们需求的键,我的 fieldbridge 实现将在文档中创建一个条目。(我们显然不想将每个键都存储在索引中。

主要查询实际上没有什么特别的:

FullTextSession fullTextSession = Search.getFullTextSession(getCurrentSession());
try {
    fullTextSession.createIndexer(Form.class).startAndWait();
} catch (InterruptedException ex) {
    LOG.error("Exception when indexing: ", ex);
}
QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Entity.class).get();
org.apache.lucene.search.Query query;
BooleanJunction booleanJunction = builder.bool();
booleanJunction.must(builder.keyword().onFields("data")
.matching(searchString).createQuery());

因此,我的问题是,我做错了什么,以至于这个查询需要这么长时间来处理?如果您希望我提供任何可能帮助您解决此问题的额外信息,请询问,我将提供。我不知道包含TwoWayFieldBridge代码有多重要,但如果问题可能出在那里,请询问。


更新:从这个意义上说,公认的答案是正确的,这导致了显着的放缓。我建议从一开始就为您的应用程序编制索引,如果无法做到这一点,您可以附加一种 startuplistener(取决于所使用的框架或上下文),并使用此代码启动索引器。请注意,您需要打开足够的可用连接,否则这可能会阻止您的应用程序启动。

如果您显示的代码显示"搜索代码",那么您的问题是,您正在索引每个搜索的数据。这会索引Form类:

try {
    fullTextSession.createIndexer(Form.class).startAndWait();
} catch (InterruptedException ex) {
    LOG.error("Exception when indexing: ", ex);
}

您只想执行此操作一次,或者在数据更改时执行此操作。代码使用质量索引器 API 为现有数据编制索引 (createIndexer(Form.class).startAndWait() )。此方法的目的是创建现有数据的初始索引。例如,一旦数据被索引,你可以依靠Hibernate搜索的自动索引,它将为数据更改注册一个侦听器,并且只索引添加或更改的数据。或者,如果需要/需要此级别的控制,可以手动编制索引。我建议您参考文档以了解有关这些不同类型的索引的更多信息。

最新更新