gpt4 book ai didi

java - Lucene TwoWayFieldBridge 慢查询

转载 作者:行者123 更新时间:2023-12-01 12:03:08 27 4
gpt4 key购买 nike

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

正在索引和搜索的主字段的类型为 Map<String, String> ,并映射为:

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

或者换句话说,该实体有一个带有键值对的关联表。我们想要搜索这些值,但仅限于特定的键。因此,如果我们遇到满足我们需求的 key ,我的 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 有多相关代码,但如果问题可能出在此处,请询问。

<小时/>

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

最佳答案

如果您显示的代码是“搜索代码”,那么您的问题是,您正在为每个搜索的数据建立索引。这索引了 Form 类:

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

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

关于java - Lucene TwoWayFieldBridge 慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27855990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com