gpt4 book ai didi

java - Apache Lucene createWeight() 用于通配符查询

转载 作者:行者123 更新时间:2023-12-02 12:22:08 25 4
gpt4 key购买 nike

我正在使用 Apache Lucene 6.6.0,我正在尝试从搜索查询中提取术语。当前版本的代码如下所示:

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

它工作得很好,但最近我注意到它不支持使用通配符(即 * 符号)的查询。如果查询包含通配符,则会出现异常:

java.lang.UnsupportedOperationException: Query id:123*456 does not implement createWeight at org.apache.lucene.search.Query.createWeight(Query.java:66) at org.apache.lucene.search.IndexSearcher.createWeight(IndexSearcher.java:751) at org.apache.lucene.search.BooleanWeight.(BooleanWeight.java:60) at 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);

请参阅主题:

了解更多详情。

似乎提到的堆栈溢出问题是这个:How to get matches from a wildcard Query in Lucene 6.2 .

关于java - Apache Lucene createWeight() 用于通配符查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45692380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com