2012-07-14 58 views
2

我試圖改進一個iOS應用程序的搜索算法,它提供了一些雜誌與大量的文章。爲此,我使用了Micheal Papp的S4LuceneLibrary(git repo),這是一個相當於Apache Lucene全功能文本搜索引擎庫的iOS。 問題是,現在的搜索是非常incinctent ...這意味着搜索特定的單詞後,有時很長,而另一方面有時不。lucene在iOS中搜索不一致

這是單詞的列表,我正在尋找,時間搜索了:

  • 柏林(34次點擊) - > 3,5秒
  • 標籤(29次點擊) - > 8 3秒
  • 豪斯(3次點擊) - > 3,6-秒
  • 大街(28次點擊) - >8秒
  • Raumfahrt(5次點擊) - > 6,2秒
  • 天文學(9次命中) - > 1秒

所以結果有點不同,但我認爲每個搜索短語都要花費相同的時間。你知道區別在哪裏嗎?

在此先感謝:)

+0

這些響應時間非常高,特別是對於簡單的術語查詢......我不相信有n在庫代碼或客戶端代碼中確實存在錯誤。雖然我對Lucene很熟悉,但我對iOS並不熟悉。 iOS上有沒有可用的分析工具可以幫助您找到瓶頸? – jpountz 2012-07-14 16:45:40

+0

是的,它們有點高,但是如果你比較時間,它們會以8的最大因子來區分,這就讓我感到困惑。所以「天文學」這個詞只需要1秒,而「標記」這個詞需要超過8秒。這是爲什麼? – 2012-07-19 09:32:30

回答

0

哇,這些基準!你的索引/集合有多大?

我假設在這裏,你正在以編程方式搜索你的索引? (而不是通過一些複雜的實現/用戶界面,這可能有自己的故障)

我的第一個停靠港將是確保您正確地索引您的收藏首先。尤其是:請檢查您在每個文檔中放置的字段的構造函數。構造函數的某些形式採用布爾值作爲'store'和'index':確保你已經通過它:store.yesindex.yes在這種情況下,否則它們將在那裏並且可以檢索,但不是通過lucene的倒排索引 - 關鍵的整個工具。

但是,考慮到您的收藏可能沒有變化,如果是這種情況,奇怪的是您的搜索時間大不相同。

你能告訴我們你如何填充/查詢你的索引?

0

好的,測試我有6本雜誌,每本都有自己的索引。因此指數大小爲:

434KB,41KB,139KB,434KB,57KB和57KB

我的索引代碼是:

LCSimpleAnalyzer *analyzer = [[LCSimpleAnalyzeralloc] init]; 
    LCIndexWriter *writer = [[LCIndexWriteralloc] initWithDirectory:[selfcreateFileDirectoryWithEmagPath:emagModel.emagPath] analyzer: analyzer create: YES]; 

... 
// creating searchResult 
... 

// adding relevant information to lucene document 
LCDocument *doc = [[LCDocumentalloc] init]; 

LCField *fieldContent = [[LCFieldalloc] initWithName: @"content_to_search"string:bodyText store:LCStore_YES index:LCIndex_Tokenized]; 
LCField *fieldResult = [[LCFieldalloc] initWithName:@"data" data: [NSKeyedArchiverarchivedDataWithRootObject:result] store:LCStore_YES]; 

[doc addField:fieldContent]; 
[doc addField:fieldResult]; 

[writer addDocument:doc]; 

... 
// releasing stuff and close writer 

而這對於搜索代碼:

// search 
LCIndexSearcher *searcher = [[LCIndexSearcheralloc] initWithDirectory: [selfgetFileDirectoryOfEmagPath:emagPath]]; 
LCTerm *term = [[LCTermalloc] initWithField: @"content_to_search" text: self.searchText]; 
LCTermQuery *termQuery = [[LCTermQueryalloc] initWithTerm:term]; 

LCHits *hits = [searcher search:termQuery]; 

thx