2014-04-30 30 views
1

我們在我們的架構中存儲了一個路徑,以斜槓分隔,並且它也以斜槓開始。根據this post solr在查詢開始時將斜槓解釋爲版本4.0之後的正則表達式表達式,這意味着我們需要跳過斜槓。你可以在spring-data-solr中修改字符轉義嗎?

SolrTemplate.queryForPage(Query, Class)不會跳過斜槓,所以自然的解決方法是使用上面鏈接中建議的QueryParser.escape(searchTerm)。

然而,這將增加backslashe逃跑的斜線,以及反斜線將SolrTemplate進行轉義,導致查詢轉義反斜槓 - 這給沒有結果


我會添加一對夫婦爲了清楚示例:

查詢不發生任何轉義:

q=paths:/myrootpath&start=0&rows=10 

查詢與斜線的手動轉義(QueryParser.escape(String)):

q=paths:\\/myrootpath&start=0&rows=10 

查詢我需要:

q=paths:\/myrootpath&start=0&rows=10 


我不知道這是否是一個錯誤或意圖,因爲據我所知,前期4.0 Solr的也沒必要逃避斜線

那麼在spring-data-solr中有辦法禁用查詢的字符轉義,或修改哪些字符被轉義?

+0

我米有同樣的問題。你有沒有找到解決方案? – tlavarea

+0

@tlavarea我很抱歉,但我沒有找到解決方案,但是在後來的版本中可能會有這種可能性,因爲我從事該項目已有近一年的時間。無論如何,我認爲它一定是一個錯誤。作爲解決方法,我將斜槓轉換爲/從分號轉換爲 –

+0

這是一個很好的解決方案。我base64編碼我的路徑,然後編寫一個自定義solr轉換器解碼/編碼適當。 – tlavarea

回答

1

我喜歡轉換器的想法。我們可以添加新的類的contentPath:

@AllArgsConstructor 
@ToString 
@Getter 
public class ContentPath { 
    private String path; 
} 

然後新的轉換器需要同時SolrTemplate創建登記:

SolrTemplate solrTemplate = ... 
DefaultQueryParser defaultQueryParser = new DefaultQueryParser(); 
defaultQueryParser.registerConverter(new Converter<ContentPath, String>() { 

    @Override 
    public String convert(ContentPath o) { 
     return escape(o.getPath()); 
    } 

}); 
solrTemplate.registerQueryParser(Query.class, defaultQueryParser); 

最新變化的需求,同時查詢定義做:

new SimpleQuery((new Criteria(IDENTIFIER)).is(new ContentPath(id))); 
相關問題