문제

나는 구현하려고 노력하고있다 측면 검색 또는 다중 태그 필터링으로 태깅. Faceted Navigation에서는 비어 있지 않은 범주 만 표시되며 이미 적용된 기준과 일치하는 범주의 항목 수는 괄호 안에 표시됩니다.

내부 조인을 사용하여 할당 된 카테고리를 가진 모든 항목을 얻을 수 있습니다. 그리고 Count 및 Group을 사용하여 모든 카테고리에서 항목 수를 얻으십시오., 그러나 수백만 개의 물체와 수천 개의 태그로 어떻게 확장 될지 잘 모르겠습니다. 특히 계산.

나는 관련이없는 솔루션이 있다는 것을 알고 있습니다 Lucene + Solr, 그러나 나는 또한 기업가가 강도라고하는 폐쇄 소스 RDBMS 기반 구현도 발견했습니다. facetmap.com 또는 endeca 소프트웨어이므로 관계형 데이터베이스에서 Faceted 검색을 수행하는 효율적인 방법이 있어야합니다.

Faceted Search에서 경험이 있고 몇 가지 팁을 줄 수 있습니까?

각 카테고리 세트의 카운트를 캐시 하시겠습니까? 카운터를 업데이트 할 스마트 증분 기술을 사용할 수 있습니까?

편집하다:

패싯 내비게이션의 예는 여기에서 찾을 수 있습니다. 플라멩코.

현재 표준 3 테이블 체계 (여기에 설명 된 것과 같은 항목, 태그 및 항목 _tags가 있습니다. http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi ) 플러스 패싯 용 테이블. 각 태그는 패싯을 할당했습니다.

도움이 되었습니까?

해결책

나는 Nils의 말만 확인할 수 있습니다. RDBM은 다차원 검색에 좋지 않습니다. 나는 스마트 솔루션, 캐싱 카운터, 트리거를 사용하는 등을 사용했습니다. 그러나 결국 외부 전용 인덱서는 항상 승리합니다.

어쩌면 데이터를 차원 모델로 변환하여 일부 OLAP [MDX 엔진]에 공급하면 잘 작동합니다. 그러나 너무 무거운 솔루션처럼 보이며 실시간이 아닙니다.

반대로 전용 인덱싱 엔진을 사용한 솔루션 (Lucene 생각, 생각 스핑크스)는 증분 인덱스 업데이트로 거의 실시간 시간을 할 수 있습니다.

다른 팁

IMO, 관계형 데이터베이스는 검색에 적합하지 않습니다. Solr/Lucene과 같은 전용 검색 엔진에서 더 나은 성능을 얻을 수 있습니다.

Faceted Search는 분석적 문제로, 이는 치수 설계가 좋은 내기임을 의미합니다. 일명, 검색하는 것은 테이블 형식이어야합니다.

분석 테이블에 관심있는 모든 열을 포함하십시오.

연속 값을 버킷에 넣습니다.

카테고리 또는 태그와 같은 "많은"항목에 부울 열을 사용하십시오. 예제 "Foo", "Bar"및 "BAZ"가 3 개의 태그가있는 경우 3 개의 부울 열이 있습니다.

구체화 된보기를 사용하여 분석 테이블을 만듭니다.

쓰레기를 색인화하십시오. 일부 데이터베이스는 이러한 유형의 응용 프로그램에 대한 인덱스를 지원합니다.

한 번만 필터.

결과를 조합하십시오.

공통 쿼리에 대한 사전 응집 된 구체화 된 뷰를 구축하십시오.

이 기사도 도움이 될 수 있습니다. https://blog.jooq.org/2017/04/20/how-to-calculate-multiple-aggregate-functions-in-a-single-query/

with filtered as (
    select
    *
    from cars_analytic
    where
        [some search conditions]
)

--for each facet:

select
    'brand' as facet,
    brand as value,
    count(*) as count
from
    filtered
group by
    brand

union

select
    'cool-tag' as facet,
    'cool-tag'as value,
    count(*) as count
from
    filtered
where
    cool_tag

union

...


-- sort at the end
order by
    facet,
    count desc,
    value

~ 150ms에 5 개의 측면이있는 100,000 레코드

카운트와 관련하여 왜 SQL을 통해 당기는가? 어쨌든 코드에서 결과 세트를 반복해야하므로 왜 계산하지 않겠습니까?

현재이 접근 방식을 개발 중이며 잘 작동하고 있습니다. 까다로운 부분은 새로운 패싯에 도달 할 때까지 패싯을 출력하지 않도록 코드를 설정하는 것입니다. 당시에는 패싯과 발견 한 행의 수를 출력하십시오.

이 접근법은 모든 일치하는 항목의 목록을 철회하고 동일한 패싯이있는 여러 행을 가져 오는 것으로 가정합니다. 패싯 으로이 결과를 주문하면 대신 코드에서 수를 쉽게 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top