2012-07-14 3 views
2

기사가 많은 잡지를 제공하는 iOS 앱의 검색 알고리즘을 개선하려고합니다. 이를 위해 Micheal Papp의 S4LuceneLibrary (git repo)를 사용했습니다.이 라이브러리는 Apache Lucene의 모든 기능을 갖춘 텍스트 검색 엔진 라이브러리와 동일한 기능을합니다. 문제는 검색이 매우 일관성이 없다는 것입니다. 즉, 특정 단어를 검색 한 후 가끔씩 매우 오래 걸리고 다른 한편으로는 때때로 그렇지 않은 검색을 의미합니다. 단어의 목록입니다 iOS에서 lucene 검색이 일치하지 않습니다.

, 나는 검색되었고, 시간이 검색에 나섭니다 :

  • 베를린 (34 안타) -> 3,5 초
  • 태그 (29 안타) -> 8 3 초
  • 하우스 (3 히트) -> 3,6 초
  • 트 (28 안타) -> 8초
  • Raumfahrt (5 명중) -> 6,2 초
  • Astronomie (9 개 히트) -> 1 초

결과가 다르지만 모든 검색 구문에 대해 동일한 시간이 걸릴 것으로 생각했습니다. 차이점이 어디인지 아십니까?

미리 감사드립니다. :)

+0

이 응답 시간은 특히 간단한 검색어에 대해 매우 높습니다. 라이브러리 코드 나 클라이언트 코드에서 실제로 잘못된 점이 있습니다. Lucene에 익숙하지만 iOS에 익숙하지 않습니다. iOS에서 병목 현상을 찾는 데 도움이되는 프로파일 링 도구가 있습니까? – jpountz

+0

예, 그들은 일종의 최고이지만, 시간을 비교해 보면 최대 8 팩터로 차별화되고 있으며, 저를 혼란스럽게합니다. 그래서 "Astronomie"라는 단어는 1 초가 걸리고 "Tag"같은 단어는 8 초 이상 걸립니다. 왜 그런가요? –

답변

0

와우, 그 벤치 마크! 귀하의 색인/컬렉션은 얼마나 큰가요?

여기서 가정하겠습니다. 색인을 프로그래밍 방식으로 검색하고 있습니까? (어떤 복잡한 구현/UI를 통해서가 아니라).

내 첫 번째 호출은 처음에 컬렉션을 올바르게 인덱싱하는 것입니다. 특히 : 각 문서에 넣은 필드의 생성자를 확인하십시오. 생성자의 일부 형식은 'store'및 'index'에 대한 부울을 사용합니다.이 문맥에서는 store.yesindex.yes을 전달했는지 확인하십시오. 그렇지 않으면 lucene의 역 색인을 통해가 아니라 검색 할 수 있습니다. 전체 도구의

그러나 컬렉션의 크기가 변경되지 않았다고 가정하면 검색 시간이 크게 달라지는 것은 이상한 일입니다.

채우기/색인을 쿼리하는 방법을 보여줄 수 있습니까?

0

테스트를 위해 6 권의 잡지가 있으며 각각 색인이 있습니다. 따라서 인덱스의 크기는 다음과 같습니다

434킬로바이트, 41킬로바이트, 1백39킬로바이트, 434킬로바이트, 57킬로바이트 및 57킬로바이트

색인에 대한 나의 코드는 다음과 같습니다

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

관련 문제