Java 用于通配符查询的Apache Lucene createWeight()

Java 用于通配符查询的Apache Lucene createWeight(),java,apache,lucene,Java,Apache,Lucene,我正在使用ApacheLucene6.6.0,并试图从搜索查询中提取术语。当前版本的代码如下所示: Query parsedQuery = new AnalyzingQueryParser("", analyzer).parse(query); Weight weight = parsedQuery.createWeight(searcher, false); Set<Term> terms = new HashSet<>(); weight.extractTerms(t

我正在使用ApacheLucene6.6.0,并试图从搜索查询中提取术语。当前版本的代码如下所示:

Query parsedQuery = new AnalyzingQueryParser("", analyzer).parse(query);
Weight weight = parsedQuery.createWeight(searcher, false);
Set<Term> terms = new HashSet<>();
weight.extractTerms(terms);
Query parsedQuery=new AnalyzingQueryParser(“,analyzer”).parse(查询);
Weight-Weight=parsedQuery.createWeight(searcher,false);
Set terms=新的HashSet();
重量.术语(术语);
它工作得非常好,但最近我注意到它不支持带有通配符的查询(即
*
符号)。如果查询包含通配符,则会出现异常:

java.lang.UnsupportedOperationException:查询 id:123*456不在上实现createWeight org.apache.lucene.search.Query.createWeight(Query.java:66)位于 org.apache.lucene.search.IndexSearcher.createWeight(IndexSearcher.java:751) 在 org.apache.lucene.search.BooleanWeight.(BooleanWeight.java:60) 在 org.apache.lucene.search.BooleanQuery.createWeight(BooleanQuery.java:225)


那么,有没有一种方法可以将
createWeight()
用于通配符查询?或者,也许有另一种方法可以从查询中提取搜索词,而无需
createWeight()

长话短说,有必要重写查询,例如,如下所示:

final AnalyzingQueryParser analyzingQueryParser = new AnalyzingQueryParser("", analyzer);

// TODO: The rewrite method can be overridden.
// analyzingQueryParser.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE);

Query parsedQuery = analyzingQueryParser.parse(query);
// Here parsedQuery is an instance of the org.apache.lucene.search.WildcardQuery class.

parsedQuery = parsedQuery.rewrite(reader);
// Here parsedQuery is an instance of the org.apache.lucene.search.MultiTermQueryConstantScoreWrapper class.

final Weight weight = parsedQuery.createWeight(searcher, false);
final Set<Term> terms = new HashSet<>();
weight.extractTerms(terms);
final AnalyzingQueryParser AnalyzingQueryParser=new AnalyzingQueryParser(“,analyzer”);
//TODO:可以重写重写方法。
//分析QueryParser.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT\u SCORE\u BOOLEAN\u REWRITE);
Query parsedQuery=analyzingQueryParser.parse(查询);
//这里parsedQuery是org.apache.lucene.search.WildcardQuery类的一个实例。
parsedQuery=parsedQuery.rewrite(读卡器);
//这里parsedQuery是org.apache.lucene.search.MultiTermQueryConstantCoreWrapper类的一个实例。
最终权重=parsedQuery.createWeight(searcher,false);
final Set terms=新HashSet();
重量.术语(术语);
请参考以下线程:

  • 不可否认:
  • 邮件存档:
详情请参阅


上面提到的堆栈溢出问题似乎是这样的:。

对我来说,它看起来像是一种黑魔法,但它确实起了作用。谢谢@DmytroTitov,很高兴它有帮助!同意你的观点:这并不简单。