2011-11-18 45 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