2009-12-24 42 views
1

我的應用程序使用Lucene.NET來索引各種文本文件。由於每個文本文件的結構都不相同,因此每個文件的全部內容都存儲在一個「內容」字段中。使用Lucene查詢部分URL

一些文本文件中包含的網址,例如:

http://domain1.co.uk/blah 
http://domain2.co.ru/blahblah 

我使用的指數代碼中的每個文件是:

Lucene.Net.Documents.Field fldContent = new Lucene.Net.Documents.Field("content", contents, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED, Lucene.Net.Documents.Field.TermVector.YES); 

其中, 「內容」 是文件內容。

當查詢文件時,Lucene僅在搜索確切的域名(例如domain1.co.uk)時返回結果,並且不返回部分域名(例如domain1.co)的結果。 用來構建查詢的代碼是:

Lucene.Net.Index.Term searchTerm = new Lucene.Net.Index.Term("content", "domain1.co"); 
Lucene.Net.Search.Query query = new Lucene.Net.Search.TermQuery(searchTerm); 

你有任何想法,爲什麼我必須尋找使用完全相同的域名?

回答

0

StandardAnalyzer/Tokenizer是這裏的罪魁禍首 - 它最好能夠使URL可搜索,但在這種情況下,它不會匹配部分主機名。標準方法是創建一個自定義分析器/標記器 - 爲此,我可以指向另一個SO question with a similar problem and solution

+0

謝謝,我寫了一個新的分析器/標記器,並添加一些字作爲詞分隔符。 – Moshe 2009-12-24 14:37:22

0

您爲IndexWriter指定了哪個分析器?如果標記錯誤,告訴Lucene標記一個字段對你沒有好處。對於你想要的,聽起來像你需要確保你的標記器分裂爲「。」。也可能它正在生成n-gram(後者可能不是必需的)。您應該更多地瞭解可用的各種分析儀,並查看哪個分析儀行爲可以讓您最接近您想要的。否則,您可以隨時編寫自定義分析器。確保你使用相同的分析器進行索引搜索,所以如果你索引變成「domain1 co uk」的「domain1.co.uk」並搜索變成「domain co」的「domain1.co」,你會在那裏找到一個匹配,而非原文查詢「domain1.co」不匹配。