在执行搜索之前操纵Lucene查询

时间:2011-11-18 06:51:59

标签: java solr lucene

我正在开发一个使用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,但也没有运气。请帮忙。

1 个答案:

答案 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);
  }
}