gpt4 book ai didi

java - 使用通配符查询时 BooleanQuery$TooManyClauses 异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:38 26 4
gpt4 key购买 nike

我正在使用 Hibernate Search/Lucene 维护一个非常简单的索引来按名称查找对象——没有花哨的东西。

我的模型类都扩展了一个类NamedModel,它基本上如下所示:

@MappedSuperclass
public abstract class NamedModel {
@Column(unique = true)
@Field(store = Store.YES, index = Index.UN_TOKENIZED)
protected String name;
}

我的问题是,在查询名称以特定字母开头的对象的索引时,我得到一个 BooleanQuery$TooManyClauses 异常,例如“名称:l*”。像 "name:lin*" 这样的查询将毫无问题地工作,事实上任何在通配符前使用一个以上字母的查询都可以工作。

在网上搜索类似问题时,我只发现人们使用非常复杂的查询,而且似乎总是会导致异常。我不想增加 maxClauseCount,因为我认为仅仅因为达到限制就更改限制不是一个好的做法。

这里有什么问题?

最佳答案

Lucene 尝试将您的查询从简单的 name:l* 重写为所有术语都以 l 开头的查询(类似于 name:lou OR name:la OR name: 。 ..) - 我相信这是为了更快。

作为解决方法,您可以使用 ConstantScorePrefixQuery 而不是 PrefixQuery:

// instead of new PrefixQuery(prefix)
new ConstantScoreQuery(new PrefixFilter(prefix));

但是,这会改变文档的评分(因此如果您依赖分数进行排序,则会进行排序)。当我们面临需要分数(和提升)的挑战时,我们决定寻求一种解决方案,在可能的情况下使用 PrefixQuery 并在需要时回退到 ConstantScorePrefixQuery:

new PrefixQuery(prefix) {
public Query rewrite(final IndexReader reader) throws IOException {
try {
return super.rewrite(reader);
} catch (final TooManyClauses e) {
log.debug("falling back to ConstantScoreQuery for prefix " + prefix + " (" + e + ")");
final Query q = new ConstantScoreQuery(new PrefixFilter(prefix));
q.setBoost(getBoost());
return q;
}
}
};

(作为一种增强,可以使用某种LRUMap 来缓存之前失败的术语,以避免再次经历代价高昂的重写)

不过,我无法帮助您将其集成到 Hibernate Search 中。切换到 Compass 后,您可能会问;)

关于java - 使用通配符查询时 BooleanQuery$TooManyClauses 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1570911/

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