{"record":{"id":"998f348ea6b7cfda","repo":"languagetool-org/languagetool","slug":"term-pos-combination-not-supported-yet-patternt","errorCode":null,"errorMessage":"Term/POS combination not supported yet: + patternToken","messagePattern":"Term/POS combination not supported yet: \\+ patternToken","errorType":"exception","errorClass":"UnsupportedPatternRuleException","httpStatus":null,"severity":"error","filePath":"languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java","lineNumber":109,"sourceCode":"  private BooleanClause makeQuery(PatternToken patternToken) throws UnsupportedPatternRuleException {\n    checkUnsupportedElement(patternToken);\n\n    String termStr = patternToken.getString();\n    String pos = patternToken.getPOStag();\n\n    BooleanClause termQuery = getTermQueryOrNull(patternToken, termStr);\n    BooleanClause posQuery = getPosQueryOrNull(patternToken, pos);\n\n    if (termQuery != null && posQuery != null) {\n      // if both term and POS are set, we create a query where both are at the same position\n      if (mustOccur(termQuery) && mustOccur(posQuery)) {\n        SpanQuery spanQueryForTerm = asSpanQuery(termQuery);\n        SpanQuery spanQueryForPos = asSpanQuery(posQuery);\n        SpanQuery[] spanClauses = {spanQueryForTerm, spanQueryForPos};\n        return new BooleanClause(new SpanNearQuery(spanClauses, 0, false), BooleanClause.Occur.MUST);\n      } else {\n        // should not happen, we always use Occur.MUST:\n        throw new UnsupportedPatternRuleException(\"Term/POS combination not supported yet: \" + patternToken);\n      }\n    \n    } else if (termQuery != null) {\n      return termQuery;\n\n    } else if (posQuery != null) {\n      return posQuery;\n    }\n    throw new UnsupportedPatternRuleException(\"Neither POS tag nor term set for element: \" + patternToken);\n  }\n\n  private SpanQuery asSpanQuery(BooleanClause query) {\n    if (query.getQuery() instanceof MultiTermQuery) {\n      return new SpanMultiTermQueryWrapper<>((MultiTermQuery) query.getQuery());\n    } else {\n      Set<Term> terms = new HashSet<>();\n      try {\n        indexSearcher.createWeight(query.getQuery(), false).extractTerms(terms);","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java#L91-L127","documentation":"Search-index guard in makeQuery: the pattern element's combination of literal term and POS tag cannot be expressed as a Lucene query for the index; the specific token is included in the message.","triggerScenarios":"Thrown at languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java:109 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use only a term or only a POS tag on that element","Relax the token (e.g. drop inflection or chunk constraints)","Skip the rule during index-based search"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}