2009-02-02 9 views
5

나는 여러 작은 웹 사이트에서 아무런 문제없이 검색 기능 (데이터베이스 콘텐츠 및 업로드 된 문서 모두)을 구현하는 데 Lucene.net을 사용했습니다. 이제 사이트에 5000 개 이상의 문서 (주로 PDF)의 색인을 생성하고 있으며 쿼리가 약간 느려지고 있습니다.캐싱 Lucene.net 검색 결과

나는 어떤 종류의 캐싱을 구현하는 것이 최선의 속도라고 가정하고 있습니다. 아무도 시작할 수있는 내 포인터/예제를 줄 수 있습니까? 캐싱 이외에 다른 제안 사항이있는 경우 (예 : 여러 인덱스를 사용해야합니까?) 나는 그것들을 듣고 싶습니다.

편집 :

느린 쿼리는 멍청한 사용자 오류입니다. 나는 내가 보여주고 있던 '페이지'대신에 한 번에 전체 결과 세트에 대한 하이라이트를 작성했습니다. 죄송합니다.

답변

5

여기서는 큰 가정을하고 색인 검색을 위해 인덱스 검색 자에게 매달리지 않을 것이라고 가정합니다.

사실이라면 인덱스에 대한 모든 쿼리에 대해 인덱스 검색기를 분명히 공유해야합니다. 인덱스가 커지면 (실제로 커질 필요가 없기 때문에) 인덱스 검색기를 다시 빌드하면 점점 더 많은 오버 헤드가 발생합니다. 이 작업을 올바르게 수행하려면 쿼리 구문 분석기 클래스에 대한 액세스를 동기화해야합니다 (스레드 안전하지 않음).

현재, Java 문서는 .net 버전에만 적용 할 수 있습니다 (발견했습니다). 문제에 대한 추가 정보를 원하시면

은 여기를 참조 : http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

+0

좋은 링크, thanks – Nick

+0

probs 없음. 이제 귀하의 웹 사이트에서 모든 것이 정상적으로 작동합니까? –

1

Lucene은 색인 검색을 신속하게 수행하기 위해 내부 "캐싱"메커니즘을 사용합니다. 나는 캐싱이 당신의 문제라고 생각하지 않습니다.

5000 색인 문서는 크기가 작지만 색인을 구성하는 방법, 색인 생성/저장 방법, 쿼리 방법 (작동 방식), 문서 크기 등에 따라 크게 달라집니다.

색인에 대해 가능한 한 많은 정보를 입력하십시오. ,

RAMDirectory idx = new RAMDirectory(); 

// Make an writer to create the index 
IndexWriter writer = 
    new IndexWriter(idx, new StandardAnalyzer(), true); 

을이 당신을 위해 작동하는 경우하지만 너무 많은 램을 사용하고 있습니다 :

Lucene.Net.Store.RAMDirectory 

당신이 원하는 사용할 수 있습니다

1

첫째, 루씬 자체가 메모리 디렉토리의 버전을 지원합니다 래퍼를 작성하고 인터페이스 또는 웹 서비스로 노출 시키십시오. 엔티티가 캐시에서 빠져 나올 때 제어 할 쿼리를 단순히 캐시하려는 경우 키워드를 기반으로 가장 일반적인 결과를 캐시하는 래퍼를 작성할 수 있습니다.

나는 앞서 언급 한 것을 선호한다. RAMDirectory를 사용하여 Lucene 저장소를 둘러싸는 웹 서비스 또는 서비스 프로젝트를 만듭니다. 그렇게하면 인덱스가 거대한 경우 웹 서버를 다른 서버에로드 할 수 있고 램이 많을 경우 즉시 결과를 얻을 수 있습니다.

1

이 인덱스를 최적화해야합니다.

또한, 이것은 캐싱을 구현하는 빠르고 쉬운 방법입니다 : HttpRuntime.Cache.Add (...);

모든 유형의 프로젝트/라이브러리에서 ASP.Net 캐시를 사용할 수 있습니다.