languagetool-org/languagetool · error · RuntimeException

Could not create query for rule + rule.getId()

Error message

Could not create query for rule + rule.getId()

What it means

Search-index guard: PatternRuleQueryBuilder could not turn the grammar rule (rule.getId()) into any Lucene query because its pattern elements are unsupported for indexing; thrown as UnsupportedPatternRuleException so the caller can skip the rule.

Solutions

  1. Simplify the rule's pattern tokens to plain terms or POS tags
  2. Skip rules that throw this exception when batch-indexing Wikipedia
  3. Extend PatternRuleQueryBuilder to support the missing construct
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java:81 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/7f50092108b36a12. Report an issue: GitHub.

Appendix: source

Thrown at languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java:81

    this.indexSearcher = indexSearcher;
    this.searchFieldName = searchFieldName;
  }

  /**
   * Iterate over all elements, ignore those not supported, add the other ones to a BooleanQuery.
   * @throws UnsupportedPatternRuleException if no query could be created for the rule
   */
  public Query buildRelaxedQuery(AbstractPatternRule rule) throws UnsupportedPatternRuleException {
    BooleanQuery.Builder builder = new BooleanQuery.Builder();
    for (PatternToken patternToken : rule.getPatternTokens()) {
      try {
        BooleanClause clause = makeQuery(patternToken);
        builder.add(clause);
      } catch (UnsupportedPatternRuleException e) {
        //System.out.println("Ignoring because it's not supported: " + element + ": " + e);
        // cannot handle - okay to ignore, as we may return too broad matches
      } catch (Exception e) {
        throw new RuntimeException("Could not create query for rule " + rule.getId(), e);
      }
    }
    BooleanQuery query = builder.build();
    if (query.clauses().isEmpty()) {
      throw new UnsupportedPatternRuleException("No items found in rule that can be used to build a search query: " + rule);
    }
    return query;
  }

  private BooleanClause makeQuery(PatternToken patternToken) throws UnsupportedPatternRuleException {
    checkUnsupportedElement(patternToken);

    String termStr = patternToken.getString();
    String pos = patternToken.getPOStag();

    BooleanClause termQuery = getTermQueryOrNull(patternToken, termStr);
    BooleanClause posQuery = getPosQueryOrNull(patternToken, pos);

View on GitHub (pinned to 2e990059ce)