2017-08-15 68 views
0

我正在使用Apache Lucene 6.6.0,並試圖從搜索查詢中提取條件。代碼的當前版本是這樣的:用於通配符查詢的Apache Lucene createWeight()

Query parsedQuery = new AnalyzingQueryParser("", analyzer).parse(query); 
Weight weight = parsedQuery.createWeight(searcher, false); 
Set<Term> terms = new HashSet<>(); 
weight.extractTerms(terms); 

它的工作原理非常精細,但最近我注意到,它不支持使用通配符(即*符號)查詢。如果查詢包含通配符(S),然後我得到一個異常:

java.lang.UnsupportedOperationException:查詢 ID:123 * 456根本不 org.apache.lucene.search.Query實施createWeight。 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()

回答

0

長話短說,就必須重寫查詢,例如,如下:

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); 

請參考線:

瞭解更多詳情。

似乎提到的堆棧溢出問題是這樣的:How to get matches from a wildcard Query in Lucene 6.2

+0

嗯,它看起來像某種黑魔法,但它確實有效。謝謝! –

+0

@DmytroTitov,很高興它已經幫助!同意你的看法:這不是直截了當的。 –