2011-01-17 4 views
4

Lucene의 Java 버전에 대한 문서를 건너 뛰었습니다. 그러나 지금까지 최상위 레벨 "이것이 작동하는 방법"정보를 볼 수 없습니다. RTFM이 필요합니다. 나무를 볼 수없는 나무입니다.)Lucene을 사용하여 RDBMS 데이터베이스에 쿼리하기

Lucene은 검색 색인을 사용하여 결과를 반환하는 것으로 알고 있습니다. 내가 아는 한, 그것들은 그 인덱스들로부터 "히트 (hit)"를 리턴합니다. 색인을 작성할 때 데이터 항목을 추가하지 않으면 리턴되지 않습니다.

그래서 지금 나는 다음과 같은 가정을 확인하려면, 괜찮

:

Q가 : 그게 내가 검색 페이지에 표시 할 데이터가 루씬의 색인에 추가 될 필요가 있다는 뜻을?

즉,
나는 등 SKU, 설명, 카테고리 이름, 같은 것들에 의해 Product의 검색하려면,하지만 난 또한 검색 결과에 속하는 Customer을 표시하려면 I를 수행

  1. 가 있는지 확인 Lucene 색인은 색인에서 비정규 화 된 Customer의 이름을가집니다.
  2. Lucene이 반환 한 히트를 사용하여 실제 제품 레코드를 데이터베이스에 쿼리하고 JOIN을 사용하여 Customer의 이름을 가져옵니다. 내가 RDBMS에 루씬 쿼리의 결과를 "가입"할 수있는 방법이 없습니다 가정,하지만 일반적인 사용에 대해 그것을 내 가정을 물어보고 싶은게 정확하고있어 이후

나는,이 옵션 1입니다 가정합니다.

답변

0

BrokenGlass's answer을 바탕으로, 내가 좀 더 생각했습니다 그리고 난 경우 우측 라인에 표시하려면 다음을 제안하고있다 :

: 추가 옵션 2를 가지고, 기본적으로

, 하나는 다음을 수행 할 수

  1. 검색하려는 데이터 만 Lucene 색인에 추가하고 일종의 키 값 (예 : 데이터베이스의 테이블 PK)을 넣으십시오.
  2. Lucene에게 조회 목록을 가져 오려면 쿼리하십시오.
  3. 선택한 데이터 액세스 계층을 사용하여 IN (value [, value]) 조건자를 포함하는 데이터베이스에 대한 쿼리를 작성하십시오.
  4. 해당 쿼리에 대한 결과를 데이터베이스에서 가져옵니다 (다른 테이블에 JOIN 포함).
  5. 결과 집합의 PK를 키로 사용하여 해당 결과를 사전에 넣습니다.
  6. Lucene 조회수를 다시 순서대로 반복하고 PK를 사용하여 사전에서 항목을 가져 와서 Lucene이 조회수를 반환 한 순서대로 결과 목록을 작성할 수 있습니다 (즉, 관련성별로 정렬).
  7. "정렬 된"결과 목록을 사용자에게 표시합니다.

물론 5 단계와 6 단계는 더 좋을 수 있지만 설명을 위해 자세한 설명을 설명에 넣습니다. Lucene 히트가 일종의 "관련성"값을 포함하면 결과 집합에 속성을 지정하고 표준 정렬을 수행 할 수 있지만 독자에게는 그럴 수 있습니다. :)

이게 될 수 있을까요?

+0

Lucene을 사용하여 "큰"데이터 세트를 검색 할 때이를 권합니다. 그렇게 많은 데이터가 없다면 인덱스에 모든 것을 넣을 수도 있고 걱정하지 않아도됩니다. 스케일을 원할 경우 인덱스를 최소화해야합니다. – BrokenGlass

1

일반적으로 색인에는 검색하려는 필드 만 포함되며 표시 할 필드는 포함하지 않아도됩니다. 검색 성능을 좋게 유지하려면 가능한 한 작게 인덱스를 최적화해야합니다.

더 많은 데이터를 표시하려면 전체 문서/데이터, 즉 Product (제품 ID?)의 고유 키를 검색 할 수있는 색인을 색인에 추가하십시오.

+0

아, 그러면 옵션 2를 제안 하시겠습니까? 괜찮 았어.하지만 목록을 되 찾으면, 결과의 각 항목에 대해 데이터베이스를 한 번 치워야 만 전체 세부 사항을 되 돌리거나 잠재적으로 엄청난'IN ([PK])' 성명서에서 내가 지은 성명서. 나는 내 자신의 질문에 대답 할 수도 있고, 내가 옳은 길을 가고 있다고 제안 할만한 표를 얻었는지 확인해 볼 수있다. :) –

+0

언제나 그렇듯이이 접근법은 검색 성능을 최적화하는 데 사용되지만 성능은 표시하지 않습니다. 그러나 일반적으로 페이지 된 결과보기에서 특히 한 번에 몇 가지 제품 세부 정보를 검색 할 때의 히트는 lucene 색인을 무효화하는 것에 비해 무시할 수 있습니다. – BrokenGlass

1

나는 같은 문제를 알아 내려고 노력했지만 그게 너무 많은 일이라고 생각한다. 나는 이것을 대안으로 생각하고있다. 내 생각에 틀렸다면 나에게 올바른 결과를 만들어주세요!

상황은 다음과 같이이다 : RDBMS 제품 (많은) < ------> (많은) 고객

대신 제품 키를 얻을, 다음과 RDBMS를 조회 할 수 루씬의 색인 만 고객을 가하고의 IN 질의에서 Product와 Cartesian 제품으로 lucene index를 생성 할 것을 제안합니다.

는 customer_1처럼, customer_1을 product_1 customer_2, product_2 .. 당신은 루씬에서 제품을 검색 할 때

이 방법은, 그것은 고객뿐만 아니라 제품 ID를 모두 제공됩니다 product_2 .. RDBMS에 합류하는 대신 RDBMS에서 필요한 정보가있는 제품과 제품을 조회 할 수 있습니다. 캐싱을 사용하는 경우 추가 세부 정보 조회 비용도 감소합니다.

+0

나는이 아이디어를 좋아한다. 처음에는 색인에 더 많은 정보를 넣으려는 귀하의 요점을 보았습니다. 조금 더 진취적인 생각이 필요하지만 앱을 업그레이드 할 때 인덱스를 다시 작성하거나 업데이트하는 좋은 방법이 있다면 제대로 작동해야합니다. –

관련 문제