2010-11-18 24 views
1

如果我試圖檢索[email protected],搜索「dave」將會像「[email protected]」一樣工作。查詢由lucene索引的電子郵件地址

但搜索「dave @ gmail」不起作用。查詢發生在Java servlet中。 我認爲這個問題可能在於分割完全停止

我該如何解決這個問題,以便「dave @ gmail」將返回「[email protected]」?電子郵件地址,也可以包含其他領域(如.co.uk)

感謝

+0

當你說你有[email protected]索引時,它是如何到達那裏的?我有一個類似的問題,我從一個文件中讀取並添加到我的索引中。我沒有意識到的是,我運行Apache tika從文件中獲取文本。 apache tika的解析器將電子郵件ID分別標記爲文本到達lucene分析器的時間,損壞已經完成。如果你正在使用這樣的實現並且你找到了答案。讓我知道。 – 2013-09-30 20:00:17

回答

3

Lucene的使用「儀」以tokenise和索引文檔。同樣,分析器用於標記用戶搜索查詢。

一個常見的錯誤是使用不同的分析器進行索引而不是搜索,兩者都必須與您匹配以獲得您期望的結果(搜索this doc「常見錯誤」)。

standard lucene tokeniser可識別電子郵件字符串並將它們編入索引。

它將索引[email protected]作爲[token:[email protected]]。但是,您用來標記查詢的分析器(或者如果您正在手動構建查詢)可能會將其分解爲3個標記,並以非字母數字字符分割。所以你可能會搜索3個相鄰的令牌:[tok1:dave] [tok2:gmail] [tok3:com],它們不存在。

Query.toString可能會「漂亮地打印」您正在提交給Lucene的Query,它可能會幫助您進行調試。

+0

我爲兩者使用標準記號器。但是,如果整個電子郵件地址是單個令牌,那麼這是否解釋了爲什麼我沒有得到我想要的結果?例如。如果我搜索「yah」,我希望「yahoo」能夠包含在搜索結果中嗎? – chazmuzz 2010-11-18 14:10:37

+0

這取決於,在索引過程中可能使用一系列分析器,有些人可能會將電子郵件索引爲3個令牌(dave,gmail,com),另一個可能會將整個索引編入索引([email protected])。這可以解釋爲什麼你會受到戴夫的打擊。你可以使用Luke檢查你的索引的內容 - 看看你是否可以看到令牌'[email protected]'爲單個實體。在您的查詢中也嘗試使用toString,以確保您提交「[email protected]m」 – Joel 2010-11-18 15:09:11

0

使用

org.apache.lucene.analysis.standard.UAX29URLEmailTokenizer 

org.apache.lucene.analysis.KeywordTokenizer 

標記生成器,以能夠通過電子郵件

0

你可以使用模糊在查詢搜索一個分析器進行搜索。這將近似由用戶定義levenshtein距離(LD)設置的結果。

相關問題