2017-12-27 3 views
0

IndexWriter와 함께 SearcherManager 사용에 관한 몇 가지 기본적인 질문이 있습니다.SearchManager에서 IndexWriter 사용

주기적으로 응용 프로그램에서 Lucene 색인을 다시 작성해야하며 현재는 검색 요청을 처리하는 스레드가 아닌 다른 스레드에서 발생합니다.

  1. 주기적으로 인덱스를 다시 작성하기 위해 응용 프로그램의 수명 기간 동안 동일한 IndexWriter 인스턴스를 사용할 수 있습니까? 현재는 시작시 한 번만 생성/열기하고 새 인덱스가 생성 될 때마다 IndexWriter#commit으로 전화하십시오.
  2. 각 검색 요청에 대해 IndexSearcher 인스턴스를 획득하고 출시하려면 SearcherManager을 사용하고 있습니다. 인덱스가 주기적으로 작성된 후 메소드를 사용하여 IndexSearcher instances.SearcherManager 인스턴스를 새로 고치면 시작 중에 한 번만 작성되며 계속 유지하려고합니다.
  3. 나는 앱의 수명 기간 동안 IndexWriter 또는 SearcherManager을 닫지 않습니다. 질문에 대한 지금

,

  1. 내가 인덱스를 다시 작성해야 할 때마다 새로운 IndexWriter를 생성하는 경우, SearcherManager#maybeRefresh는 새로운 IndexWriter 인스턴스의 것을 감지 할 수있을 것인가? 아니면 새로 생성 된 IndexWriter를 사용하여 새로운 SearcherManager를 생성해야합니까?
  2. IndexWriter을 사용하여 인스턴스를 생성하고 DirectoryReader을 사용하여 생성하거나 Directory을 사용하여 인스턴스를 생성하는 것의 차이점은 무엇입니까?

    당신이 SearcherManager에서 획득 한 미래의 모든 IndexSearchers 해당 판독기를 기반으로합니다,DirectoryReader로를 구성하는 경우, 즉 모든 검색 것 :

답변

1

대답은 당신이 당신의 SearcherManager를 구성하는 방법에 따라 달라집니다 SearcherManager를 인스턴스화 한 시점의 결과를 제공하십시오. 색인/디렉토리에 데이터를 쓰고 나중에 SearcherManager.maybeRefresh()을 실행하면 독자가 업데이트되지 않고 검색 결과가 오래되었습니다.

당신이 IndexWriter으로 SearcherManager를 구성하면 데이터가 기록과 작가에 의해 커밋 된 경우, SearcherManager.maybeRefresh()이 SearcherManager의 독자를 업데이트합니다. 새로 인수 한 모든 IndexSearchers는 기본 인덱스의 새로운 상태를 반영합니다.

경험이 부족한데도 불구하고 후자의 접근 방식을 사용하는 것이 좋습니다. near-real-time searching을 구현하는 매우 간단한 방법을 제공합니다. 응용 프로그램 시작시 IndexWriter를 만들고 SearcherManager를 구성합니다. 이후 IndexWriter의 모든 변경 사항을 정기적으로 커밋하고 SearcherManager를 새로 고치는 백그라운드 스레드를 시작합니다. 응용 프로그램의 수명 동안 초기 IndexWriter 및 SearcherManager를 닫거나 다시 열지 않고도 계속 사용할 수 있습니다.


PS : 난 단지 몇 일 전에 루씬 작업을 시작했다, 그래서 100 % 특정 여기에 쓴 모든 것을하지 않습니다.

관련 문제