代码之家  ›  专栏  ›  技术社区  ›  Koraktor

使用通配符查询时BooleanQuery$ToomanyCauses异常

  •  3
  • Koraktor  · 技术社区  · 15 年前

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

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

    我的问题是我得到了一份工作 BooleanQuery$TooManyClauses 查询名称以特定字母开头的对象的索引时出现异常,例如。 "name:l*" . "name:lin*"

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

    这里有什么问题?

    1 回复  |  直到 15 年前
        1
  •  3
  •   sfussenegger    15 年前

    Lucene试图从simple重写您的查询 name:l* name:lou OR name:la OR name: ... )-我相信这是为了更快。

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

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

    前缀搜索 如果可能的话,回退到 ConstantCorePrefixQuery 如有需要:

    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搜索中。你可能会在换了电视后问 Compass ;)