Nice programing

SQL Server로 Lucene.Net 구성

nicepro 2020. 12. 5. 10:37
반응형

SQL Server로 Lucene.Net 구성


SQL 서버와 함께 제공되는 전체 텍스트 검색을 사용하는 대신 Lucene.NET을 사용한 사람이 있습니까?

그렇다면 구현 방법에 관심이 있습니다.

예를 들어 매시간 데이터베이스를 쿼리 한 다음 결과를 lucene.net 인덱스에 저장하는 Windows 서비스를 작성 했습니까?


네, 당신이 설명하는 그대로 사용했습니다. 우리는 두 개의 서비스를 가지고있었습니다. 하나는 읽기 용이고 다른 하나는 쓰기 용이었습니다. 단 하나의 서비스 (작성자)로이를 수행하고 웹 앱과 서비스에 리더를 내장 할 수 있었을 것입니다.

lucene.net을 일반 데이터베이스 인덱서로 사용했기 때문에 기본적으로 DB ID (인덱싱 된 이메일 메시지 용)를 얻었으며,이를 사용하여 검색 결과를 채우는 데 충분한 정보를 얻었습니다. 데이터 베이스. 두 경우 모두 훌륭하게 작동합니다. 따라서 SQL이 약간 느려질 수 있습니다. ID를 가져오고 ID를 선택해야하기 때문입니다. 임시 테이블 (ID 행만 포함)을 만들어이 문제를 해결했습니다. 파일 (lucene의 출력)에서 대량 삽입 한 다음 메시지 테이블에 결합합니다. 훨씬 빨랐습니다.

Lucene은 완벽하지 않으며 관계형 데이터베이스 상자 밖에서 조금만 생각해야합니다. 왜냐하면 그것은 완전히 하나가 아니기 때문입니다.하지만 그것이하는 일에는 매우 뛰어납니다. 볼만한 가치가 있으며 MS SQL의 FTI가 수행하는 "죄송합니다. 죄송합니다. 인덱스를 다시 작성해야합니다."라는 문제가 없습니다.

BTW, 우리는 2 천 ~ 5 천만 개의 이메일 (및 약 1 백만 개의 고유 한 첨부 파일)을 처리하고 있었으며, 총 약 20GB의 lucene 인덱스와 250GB 이상의 SQL 데이터베이스 + 첨부 파일을 처리했습니다.

성능은 환상적이었습니다. 최소한 병합 요소에 대해 생각하고 조정하십시오 (인덱스 세그먼트를 병합 할 때). 하나 이상의 세그먼트를 갖는 데 문제는 없지만, 각각에 1mil 항목이있는 두 개의 세그먼트를 병합하려고 시도하고 너무 오래 걸리면 프로세스를 종료하는 감시자 스레드가 있으면 큰 문제가 발생할 수 있습니다. .. (예, 당분간 우리 엉덩이를 찼습니다). 따라서 사물 당 최대 문서 수를 낮게 유지하십시오 (즉, 우리가 한 것처럼 maxint로 설정하지 마십시오!).

Corey Trager 편집은 여기 BugTracker.NET 에서 Lucene.NET을 사용하는 방법을 문서화 했습니다 .


나는 아직 데이터베이스에 대해하지 않았으며 귀하의 질문은 다소 열려 있습니다.

DB를 검색하고 Lucene을 사용하도록 선택할 수 있다면 데이터가 데이터베이스에 삽입되는시기를 제어 할 수도 있다고 생각합니다. 그렇다면 db를 폴링하여 재 인덱싱해야하는지, 삽입 할 때 인덱싱하거나, lucene에게 인덱싱 할 항목을 알리는 데 사용할 수있는 큐 테이블을 생성해야하는지 알아낼 이유가 거의 없습니다.

나는 그것이하는 일에 대해 무지하고 매번 재 인덱싱하거나 자원을 낭비하는 또 다른 인덱서가 필요하지 않다고 생각합니다.


lucene.net도 스토리지 엔진으로 사용했습니다. 데이터베이스보다 인덱스가있는 대체 시스템을 배포하고 설정하는 것이 더 쉽기 때문에 파일 시스템 복사본 일 뿐이며 한 시스템에서 인덱싱 할 수 있으며 새 파일을 다른 시스템에 복사하기 만하면됩니다. 색인을 배포합니다. 모든 검색 및 세부 정보는 lucene 인덱스에서 표시되며 데이터베이스는 편집에만 사용됩니다. 이 설정은 우리의 요구에 맞는 확장 가능한 솔루션으로 입증되었습니다.

SQL Server와 lucene의 차이점과 관련하여 SQL Server 2005 전체 텍스트 검색의 주요 문제점은 서비스가 관계형 엔진에서 분리되어 전체 텍스트 결과와 관계형 열 간의 조인, 주문, 집계 및 필터링 비용이 매우 많이 든다는 것입니다. 성능 측면에서 Microsoft는이 문제가 SQL Server 2008에서 해결되어 관계형 엔진 내부에 전체 텍스트 검색을 통합했다고 주장하지만 테스트하지는 않았습니다. 또한 전체 전체 텍스트 검색을 훨씬 더 투명하게 만들었습니다. 이전 버전에서는 형태소 분석기, 불용어 및 인덱싱의 여러 다른 부분이 블랙 박스처럼 이해하기 어렵고 새 버전에서는 작동 방식을 더 쉽게 볼 수 있습니다.

내 경험상 SQL 서버가 요구 사항을 충족한다면 가장 쉬운 방법이 될 것입니다. 많은 성장, 복잡한 쿼리를 예상하거나 전체 텍스트 검색에 대한 큰 제어가 필요한 경우 처음부터 lucene으로 작업하는 것을 고려할 수 있습니다. 확장 및 개인화가 더 쉬울 것입니다.


MySQL과 함께 Lucene.NET을 사용했습니다. 내 접근 방식은 인덱싱 된 텍스트와 함께 Lucene 문서에 db 레코드의 기본 키를 저장하는 것이 었습니다. 의사 코드에서는 다음과 같습니다.

  • 매장 기록 :

    텍스트 삽입, 테이블에 다른 데이터
    삽입 최신 삽입 ID 가져 오기
    lucene 문서 작성
    (ID, 텍스트)을 lucene 문서에 넣기 lucene 색인 업데이트

  • 저장된 레코드의 ID로 DB에서 결과 집합로드 데이터의 각 lucene doc에 대한
    검색 lucene 인덱스 쿼리

참고로, 뛰어난 성능으로 인해 Lucene에서 Sphinx전환 했습니다.


이 기사가 좋은 출발점이라고 생각합니다.

http://www.aspfree.com/c/a/braindump/working-with-lucene-net/

참고 URL : https://stackoverflow.com/questions/37059/configure-lucene-net-with-sql-server

반응형