這與社會安全#確實是一樣的。使用休眠搜索(Lucene),我需要能夠搜索帶有或不帶有虛線的代碼
如果我有這種格式的代碼:
WHO-S-09-0003
我希望能夠做到:
query = qb.keyword().onFields("key").matching("WHOS090003").createQuery();
我使用WhitespaceAnalyzer嘗試。
這與社會安全#確實是一樣的。使用休眠搜索(Lucene),我需要能夠搜索帶有或不帶有虛線的代碼
如果我有這種格式的代碼:
WHO-S-09-0003
我希望能夠做到:
query = qb.keyword().onFields("key").matching("WHOS090003").createQuery();
我使用WhitespaceAnalyzer嘗試。
使用StandardAnalyzer或WhitespaceAnalyzer都有同樣的問題。他們會將「WHO-S-09-0003」編入索引,這意味着當您執行搜索時,只有在搜索字詞中使用連字符時纔會起作用。 解決您的問題的一種方法是實現您自己的TokenFilter,它可以檢測代碼的格式並在編制索引期間刪除連字符。您可以使用AnayzerDef構建一個toekn過濾器鏈和一個整體定製分析器。當然,你將不得不在搜索時使用相同的分析器,但Hibernate搜索查詢DSL將處理這個問題。
其實你可以實現自己的方法,像這樣的:
private String specialCharacters(String keyword) {
String [] specialChars = {"-","!","?"};
for(int i = 0; i < specialChars.length; i++)
if(keyword.indexOf(specialChars[i]) > -1)
keyword = keyword.replace(specialChars[i], "\\"+specialChars[i]);
return keyword;
}
正如你所知道的Lucene有特殊字符,所以如果你想逃避特殊字符應該比你那個字符雙反斜線前插入...