我正在开发一个使用SOLR作为搜索引擎的Java webapp(Spring 3.x)。我希望能够拦截Lucene查询,并根据查找服务将“虚拟”搜索字段替换为两个索引字段中的任何一个(如果成功使用范围搜索,则搜索常规字段)。
,例如,给出field0:foo (field1:bar OR field1:bash) AND field2:bing
之类的查询(field1是虚拟字段)
操纵查询以获取field0:foo (field3:[42 TO 45] OR field4:bash) AND field2:bing
因此,在使用reg ex的想法后,我决定查看Lucene类,看看我是否可以重用现有的代码。我希望能够获得一个解析版本的查询,以便遍历子句,寻找某些字段进行操作。然后重新生成查询字符串并将其传递给SOLR。
我已经接近使用Lucene的QueryParser,但我只能得到术语而不是布尔运算符:
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
QueryParser queryParser = new QueryParser(Version.LUCENE_30, "text", analyzer);
try {
Query query = queryParser.parse(queryString);
Set<Term> terms = new TreeSet<Term>();
query.extractTerms(terms);
for (Term t : terms) {
logger.info("Term - field:" + t.field() + " | text:" + t.text());
}
} catch (ParseException ex) {
logger.warn(ex.getMessage(), ex);
}
我看过BooleanQuery,但也没有运气。请帮忙。
答案 0 :(得分:4)
制作自己的查询解析器:
class MyParser : MultiFieldQueryParser {
@override
public Query getFieldQuery(string field, string queryText) {
if lookupSuccessful(field, queryText) {
return myQuery(field, queryText);
}
return base.getFieldQuery(field, queryText);
}
}