2012-07-30 2 views
4

PostgreSQL 데이터베이스를 사용하고 있습니다.Lucene 또는 SQL의 성능 향상

은 구조라는 테이블 metadatavalue있는 것은 다음과 같습니다 :

아무것도 제출 또는 가 생성됩니다 거의 25 메타 데이터 필드에 항목을 추가됩니다
metadatavalue_id integer Primary Key Auto Increment 
metadta_field_id integer Foreign Key 
text_Value  varchar 
text_lang  varchar 
place   integer 

.

metadatavalue 테이블이 이미

주위

한 백 쉰 천 (150000) 레코드가 포함되어 있습니다.

필드에 자동 완성 기능을 구현하여 테이블에 metadata_field_id로 저장되는 "작성자" 이라고 말합니다.

PgSQL 프롬프트에서 테이블을 쿼리 할 때 결과를 반환하는 데 거의 1 ~ 2 초가 걸립니다.

QUERY :로

SELECT metadatavalue.text_value AS author, count(metadatavalue.text_value) AS count 
    FROM metadatavalue 
    WHERE (metadatavalue.metadata_field_id IN (SELECT metadatafieldregistry.metadata_field_id 
      FROM metadatafieldregistry 
      WHERE metadatavalue.text_value LIKE 'Pra%' AND metadatafieldregistry.metadata_schema_id = 1 AND metadatafieldregistry.element::text = 'contributor'::text)) 
    GROUP BY metadatavalue.text_value; 

의 자동차에 대해 사용자가 값을 입력 할 때 4 ~ 5 번 실행 수있는 쿼리를 완료합니다.

그래서 LUCENE 기반 검색을 구현하려고합니다.

처음에는 백엔드에서 색인을 작성한 다음 각각의 새 항목 작성에서 새 항목 색인을 작성하는 스레드를 작성합니다.

Apache Lucene이 더 나은 선택인지 또는 SQL이 최적화 될 수 있는지 알고 싶습니다.

EDIT : 메타 데이터 필드를 포함하는 다른 테이블이 있으며 값에 대한 메타 테이블 테이블에서 외부 키 (metadatafieldregistry.metadata_field_id)로 사용됩니다.

+1

표를 제대로 색인화하지 않으십니까? 그런 급진적 인 조치처럼 보입니다. – usr

답변

1

색인 생성이 완료되면 모든 데이터베이스가 정상적으로 적어도 100 만 개의 행을 처리 할 것이라고 말합니다. Lucene 또는 Solr에 들어갈 이유가 없으므로 최신 색인과 동기화하는 것과 같은 새로운 작업을 소개 할 수 있습니다 DB의 상태.

또한 Lucene 또는 Solr은 무료 텍스트 검색에 매우 적합합니다. 즉, Lucene "문서"에서 "Bob Marley"를 검색하면 "Bob Marley", "Marley Bob"또는 "Bob"및 "Marley"또는 "Bob"만있는 모든 문서를 가져옵니다. .lot 텍스트 ... Marley ". 그래서 Lucene을 사용하는 것은 당신이 다루려고하는 유스 케이스의 종류에 달려 있습니다.

당신이 표시 한 쿼리에서 metadatavalue.text_valuemetadatafieldregistry.metadata_schema_idmetadatafieldregistry.element 열을 인덱싱하면 좋은 성능을 얻을 것이라고 생각됩니다. 또한 쿼리를 in 쿼리가 아니라 조인으로 변환 해보십시오.

감사

+0

Lucene의 답변과 간단한 소개에 대해 감사드립니다. 쿼리에 대한 제안을 확인하고 업데이트로 돌아갑니다 –

+0

이전 쿼리는 처음 실행될 때 거의 2 초가 걸리고 데이터베이스 콘솔에서 후속 실행을 위해 600 밀리 초가 걸립니다. 내부 조인으로 변경하고 약 510 밀리 초가 걸립니다. 첫 번째 실행에서 약 300 밀리 초 및 후속 실행에서 그보다 훨씬 적습니다. 감사합니다. –

1

작은 데이터 세트에 대한 접두사 쿼리를 사용하면 Solr과 PostgreSQL 모두 필수 열의 색인이 제대로 작성되면 매우 잘 수행됩니다.

+0

쿼리는 단지 예일뿐입니다. 하자. 텍스트 상자에 "Pr"을 입력하면 주어진 필드에 대해 시작 값 "Pr"을 갖는 모든 행을 쿼리해야합니다. –

1

당신은 (당신이 단지 하나 개의 테이블이 있다고하지만 쿼리가 두 사용 사실에) 어떤 쿼리를 볼 수 explain analyze 출력에서 ​​

metadatafieldregistry 테이블의 스키마를 언급하지 않는다 계획은 무엇이며, 무엇을 스캔 할 시간을 차지하고 있는가. 하위 쿼리는 상호 연관되어 있으므로 거의 확실하게 좋은 계획이 아닙니다. 일반적으로 스키마는 EAV의 냄새를 맡습니다. 접두어 검색을 수행하려는 텍스트 값만 포함하는 색인을 생성하는 데 도움이되는 부분 색인을 찾을 수 있습니다 (아마도 metadata_schema_idelement을 제한하는 것입니다).

+0

하위 쿼리 점에 +1입니다. 이 쿼리는 다른 사람이 작성했으며, 나는 그것을 사용하고 있었다. 다른 테이블 세부 정보에 대한 편집 된 질문입니다. 고맙습니다 –