2008-10-11 3 views
15

Lucene.Net을 ASP.NET과 사용할 때 다른 웹 요청이 검색을 수행하는 동안 하나의 웹 요청이 인덱스에 대한 업데이트를 트리거 할 수 있다고 상상할 수 있습니다. Lucene.Net은 동시 액세스를 관리 할 수있는 기능을 내장하고 있습니까? 아니면 "다른 프로세스에서 사용되는"오류를 피하기 위해 관리해야합니까?Lucene.Net은 동일한 인덱스에 액세스하는 여러 스레드를 관리 하나, 다른 인덱스는 다른 인덱스를 검색하면서 인덱싱합니까?

편집 : 문서와 실험을 읽은 후 이것이 내가 배운 것입니다. 스레드 안전성과 동시성이라는 두 가지 문제가 있습니다. 멀티 스레딩은 인덱스에 나쁜 영향을 줄 수 없다는 점에서 "안전"합니다. 그러나 한 번에 인덱스를 잠그는 단 하나의 객체를 사용하는 것이 안전합니다. 두 번째 객체가 따라 와서 예외를 throw합니다. 따라서 검색을 열어두고 다른 스레드의 작성자가 인덱스를 업데이트 할 수 있다고 기대할 수는 없습니다. 그리고 스레드가 인덱스를 업데이트하는 중일 경우 탐색기를 만들려고하면 실패합니다.

또한 검색자가 색인을 열 때와 동일하므로 색인을 유지하고 업데이트하면 색인이 업데이트되지 않습니다.

내 검색 자에게 최신 업데이트를보고 싶었습니다.

내 설계 및 지금까지 작업 한 것 같습니다. 필자와 검색 자들이 잠금을 공유하여, 현재 쓰기 또는 검색이 완료 될 때까지 기다리지 않고 실패하지 않도록하는 것입니다.

+0

자물쇠를 어떻게 구현했는지 설명해 주시겠습니까? 읽기 및 쓰기 잠금 또는 하나의 공유 잠금을 사용합니까? –

+0

하나의 공유 잠금. 나는 내가 한 일을 썼습니다 : http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx –

+0

질문에 당신이 말한 것은 잘못되었습니다. "그래서, 당신은 할 수 있습니다. 검색을 열어두고 다른 스레드의 작성자가 인덱스를 업데이트 할 수 있도록해야하며, 스레드가 인덱스를 업데이트하는 중 바쁜 경우 검색자를 만들려고하면 실패하게됩니다. " 다른 답변에서 언급했듯이 : "색인 작성자 또는 독자는 검색이 진행되는 동안 lucene 색인 파일을 편집 할 수 있으며"그 반대의 경우도 마찬가지입니다. –

답변

2

인덱스에 동시 쓰기를 관리하는 것만큼이나 문제가 없습니다. SOLR과 함께가는 더 쉬운 길을 가졌습니다. SOLR은 서버로 실행되기 때문에 그 차이점을 대부분 추상화했습니다. this page에 따르면

21

,

인덱싱 및 검색뿐만 아니라 스레드 안전하지만, 공정 안전합니다.

  • 여러 인덱스 수색자가 동시에 루씬 인덱스 파일을 읽을 수 있습니다 : 어떤 이것이 의미하는 것입니다. 검색이 동시에 루씬 인덱스 파일을 편집하려고 할 수
  • 여러 인덱스 작가 또는 독자 지속적인 을하는 동안
  • 인덱스 작가 나 독자가 루씬 인덱스 파일을 편집 할 수 있습니다 (이것은 인덱스 작가에 대한 중요한 있어/판독기 이 닫혀 있으므로 파일 잠금이 해제됩니다. 그러나 쿼리 구문 분석기 은 스레드로부터 안전하지 않으므로 각 스레드 은 인덱스를 사용하여 고유 한 쿼리 파서를 가져야합니다. 사람들이 그것을 검색하는 동안 인덱스 를 업데이트 할 수 있도록

그러나 인덱스 작가는 스레드로부터 안전 입니다. 그러나 열린 인덱스 검색 자의 스레드를 닫고 새로 업데이트 된 데이터를 얻으려면 개를 열어야합니다. 을 확인해야합니다.

+0

각 쿼리에서 인덱스를 여는 오버 헤드는 무엇입니까? –

+1

상당히 큰 (멀티 기가 바이트) 검색 색인이 있으며 각 쿼리에서 색인을 여는 데 드는 비용은 무시할 수 있습니다. –

+1

이 기사는 원래 Lucene for Java에 관한 내용입니다. .NET 구현에 대한 언급이나 설명 된 동작이 Lucene "표준"의 기능인지 (Lucene.Net에서 다시 구현 될지) 또는 구현 관련 동작인지 여부는 없습니다. –

3

인덱스 스레드가 일부 인덱스 세그먼트를 병합하는 새 문서를 만드는 경우 병합 된 세그먼트가 삭제되고 새 세그먼트가 만들어 질 수 있습니다.문제는 인덱스 검색자가 열 때 모든 세그먼트를로드 했으므로 열려있을 때 존재했던 세그먼트에 "포인터"가있는 것과 같습니다. 이제 인덱스 작성자가 세그먼트 병합을 수행하고 세그먼트를 삭제하면 인덱스 검색자가 여전히 세그먼트 파일이 있다고 생각하고 "파일을 찾을 수 없음 오류"와 함께 실패합니다. 정말로해야 할 일은 SOLR을 사용하거나 SOLR이 수행하는 것과 유사한 자체 색인 스냅 샷 복제를 수행하여 검색 가능한 색인에서 쓰기 가능한 색인을 분리하는 것입니다. NTFS 하드 링크를 사용하여 Windows에서 .NET 및 Lucene.NET을 사용하는 SOLR과 유사한 시스템을 구축하여 효율적인 스냅 샷 복제를 수행합니다. 관심이 있다면 더 많은 정보를 드릴 수 있습니다.

+0

안녕하세요 Bob, 저는 asp.net mvc에서 SolrNet을 사용하고 있습니다. 검색이 수행되는 동안 새 항목을 추가하는 동안 색인이 손상되어 실제 문제가 발생하기 시작했습니다. 모범 사례에 대한 통찰력을 제공 할 수 있다면 감사하겠습니다. – Jordan