【发布时间】:2009-03-12 15:21:59
【问题描述】:
如果我有一个 Lucene 查询字符串
"field1:value1 myField:aValue"
有没有办法让 Lucene 解析这个,以便我可以获取术语查询?
我最终希望能够将字段名称及其值返回到我的视图数据中,以便我可以在回发时将它们填充到我的文本框中。
【问题讨论】:
标签: c# .net asp.net-mvc lucene
如果我有一个 Lucene 查询字符串
"field1:value1 myField:aValue"
有没有办法让 Lucene 解析这个,以便我可以获取术语查询?
我最终希望能够将字段名称及其值返回到我的视图数据中,以便我可以在回发时将它们填充到我的文本框中。
【问题讨论】:
标签: c# .net asp.net-mvc lucene
lucene 的QueryParser 会将该字符串转换为包含两个TermQuery 子句的BooleanQuery。您需要使用BooleanQuery 的getClauses 方法来获取术语查询。
【讨论】:
我遇到了类似的要求,但查询可以是通用的。想出了下面的方法(在java中实现)。完整代码https://github.com/atulsm/Test_Projects/blob/master/src/TestLuceneQueryStringFields.java
private static Set<String> calculateQueryFieldsRecursively(Query query) throws ParseException{
Set<String> fields = new HashSet<String>();
if(query instanceof TermQuery){
TermQuery tQuery = (TermQuery)query;
Term term = tQuery.getTerm();
fields.add(term.field());
} else if(query instanceof BooleanQuery){
BooleanQuery bQuery = (BooleanQuery)query;
List<BooleanClause> clauses = bQuery.clauses();
for(BooleanClause clause: clauses){
Query innerQuery = clause.getQuery();
Set<String> innerFields = calculateQueryFieldsRecursively(innerQuery);
if(innerFields == null){
return null;
}else{
fields.addAll(innerFields);
}
}
} else { //TODO support more lucene query types
return null;
}
return fields;
}
【讨论】: