我正在使用Lucene.net版本3.0API为我的项目创建和搜索索引。我索引中的每个文档都有三个字段:
我的要求是:
到目前为止,我有以下代码块:
var searcher = new IndexSearcher(FSDirectory.Open(path));
var parser = new MultiFieldQueryParser(Version.LUCENE_30,
new[] {"TransactionId", "Agent", "Lender"},
new StandardAnalyzer(Version.LUCENE_30));
var query = parser.Parse(queryText);
var hits = searcher.Search(query, 200);如果queryText是ab,那么查询的值是{TransactionId:ab Agent:ab Lender:ab}。
我知道我在寻找类似{TransactionId:ab* Agent:ab Lender:ab}的东西
有什么方法可以用MultiFieldQueryParser来完成吗?
发布于 2013-01-04 05:24:14
您可能可以通过子类MultiFieldQueryParser来实现这一点。
下面的内容似乎很有效,也许你可以在此基础上构建一些东西。注意,解析BooleanQuery应该是递归的,因为最终可能会出现嵌套查询。
免责声明:这段代码并不优雅,很可能很容易中断,其目的是作为一个快速示例
public class WildCardForFieldQueryParser : MultiFieldQueryParser
{
public WildCardForFieldQueryParser(Lucene.Net.Util.Version version,
string [] fields,
Analyzer analyzer,
HashSet<string> wildcardFields)
:base(version, fields, analyzer)
{
this._wildcardFields = wildcardFields;
}
public override Query Parse(string query)
{
// clause replacement should be recursive
Query q = base.Parse(query);
if (q is BooleanQuery)
{
foreach (var clause in q as BooleanQuery)
{
if (clause.Query is TermQuery && this._wildcardFields.Contains(((TermQuery)clause.Query).Term.Field))
{
clause.Query = new PrefixQuery(new Term(((TermQuery)clause.Query).Term.Field, ((TermQuery)clause.Query).Term.Text));
}
}
}
return q;
}
private HashSet<string> _wildcardFields;
}https://stackoverflow.com/questions/14147558
复制相似问题