2011-11-18 47 views
3

我正在使用SOLR作为其搜索引擎的Java webapp(Spring 3.x)。我希望能够拦截Lucene查询,并根据查找服务(如果成功使用范围搜索,则搜索常规字段)将两个索引字段中的任一个替换为“虚拟”搜索字段。在执行搜索之前操作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前的想法玩弄后,我决定看看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,但还没有运气有两种。请帮忙。

回答

3

让自己的查询分析器:

class MyParser : MultiFieldQueryParser { 
    @override 
    public Query getFieldQuery(string field, string queryText) { 
    if lookupSuccessful(field, queryText) { 
     return myQuery(field, queryText); 
    } 
    return base.getFieldQuery(field, queryText); 
    } 
} 
+0

为什么要扩展MultiFieldQueryParser VS的QueryParser?他们都实现了一个getFieldQuery()方法... – nickdos

+0

@nickdos:我个人使用'MultiFieldQueryParser',这就是我所说的。如果这是你喜欢的,你当然可以使用普通的。 – Xodarap

+0

感谢Xodarap,我一开始并不确定你的回答(不知道Lucene如何调用getFieldQuery())。但给了它一下,它完美的工作。 – nickdos