2009-12-04 29 views
14

Tôi đang cố gắng triển khai Faceted search hoặc gắn thẻ bằng tính năng lọc nhiều thẻ. Trong điều hướng mặt, chỉ các danh mục không trống được hiển thị và số lượng mục trong danh mục cũng phù hợp với tiêu chí đã áp dụng được trình bày trong dấu ngoặc đơn.Thực hiện hiệu quả tìm kiếm mặt trong cơ sở dữ liệu quan hệ

I can get all items having assigned categories using INNER JOINsget number of items in all category using COUNT and GROUP BY, tuy nhiên tôi không chắc nó sẽ mở rộng như thế nào với hàng triệu đối tượng và hàng nghìn thẻ. Đặc biệt là đếm.

Tôi biết rằng có một số giải pháp này không quan hệ như Lucene + SOLR, nhưng tôi đã tìm thấy cũng có một số triển khai RDBMS dựa trên mã nguồn đóng được cho là entreprise-sức mạnh như FacetMap.com hoặc Endeca phần mềm, vì vậy phải có một cách hiệu quả để thực hiện tìm kiếm mặt trong cơ sở dữ liệu quan hệ.

Có ai có kinh nghiệm về tìm kiếm mặt và có thể đưa ra một số mẹo không?

Cache số lượng cho từng bộ danh mục? Có thể sử dụng một số kỹ thuật gia tăng thông minh sẽ cập nhật các quầy?

Chỉnh sửa:

Ví dụ về điều hướng mặt có thể tìm thấy tại đây: Flamenco.

Hiện tại tôi có lược đồ 3 bảng tiêu chuẩn (các mục, thẻ và items_tags như được mô tả ở đây: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi) cộng với một bảng cho các khía cạnh. Mỗi thẻ đã gán một khía cạnh.

+0

Bạn có bảng thiết lập chưa? Bạn có thể cung cấp cấu trúc không? –

+0

Để làm rõ, Endeca không phải là trình bao bọc trên cơ sở dữ liệu quan hệ. Nó lưu trữ tất cả các thông tin cần thiết cho tìm kiếm mặt và các hoạt động khác trong nội bộ. –

+0

Liên kết Flamenco không hoạt động nữa. Đây có phải là cái mới không? http://flamenco.berkeley.edu/ –

Trả lời

4

Tôi chỉ có thể xác nhận những gì Nils nói. RDBMS không tốt cho tìm kiếm đa chiều. Tôi đã làm việc với một số giải pháp thông minh, bộ nhớ đệm, sử dụng trình kích hoạt, v.v. Nhưng cuối cùng, chỉ số chuyên dụng bên ngoài luôn thắng.

MAYBE, nếu bạn chuyển đổi dữ liệu của mình thành mô hình chiều và cấp dữ liệu cho một số OLAP [Tôi có nghĩa là MDX engine] - nó sẽ hoạt động tốt. Nhưng có vẻ như một giải pháp quá nặng và chắc chắn KHÔNG phải là thời gian thực.

Ngược lại, giải pháp với công cụ lập chỉ mục chuyên dụng (nghĩ Lucene, nghĩ Sphinx) có thể được thực hiện gần thời gian thực với các cập nhật chỉ số gia tăng.

5

IMO, cơ sở dữ liệu quan hệ không phải là tìm kiếm tốt. Bạn sẽ nhận được hiệu suất tốt hơn từ một công cụ tìm kiếm chuyên dụng (như Solr/Lucene).

0

Về số lượng, tại sao kéo chúng qua SQL? Bạn sẽ phải lặp lại thông qua tập kết quả trong mã của mình, vậy tại sao bạn không tính số đó?

Tôi hiện đang sử dụng phương pháp này trong ứng dụng tìm kiếm có mặt mà tôi đang phát triển và nó hoạt động tốt. Phần khó khăn duy nhất là thiết lập mã của bạn để không tạo ra các khía cạnh cho đến khi nó đạt đến một khía cạnh mới. Tại thời điểm đó, đầu ra các khía cạnh và số lượng hàng bạn tìm thấy cho nó.

Phương pháp này giả định bạn đang kéo trở lại danh sách tất cả các mục phù hợp và do đó, nhiều hàng có cùng một khía cạnh. Khi bạn đặt hàng kết quả này theo khía cạnh, thật dễ dàng để có được số đếm trong mã của bạn thay thế.

+2

Có thể có hàng trăm nghìn bản ghi phù hợp để tôi không thể lưu trữ tập hợp kết quả trong bộ nhớ. Tôi chỉ truy xuất trang đầu tiên, nhưng tôi muốn biết có bao nhiêu bản ghi từ toàn bộ tập hợp kết quả phù hợp với các danh mục được hiển thị theo các khía cạnh. –

2

Tìm kiếm khuôn mặt là một vấn đề phân tích, có nghĩa là thiết kế chiều là một đặt cược tốt. Aka, thứ bạn tìm kiếm phải ở dạng bảng.

Bao gồm tất cả các cột quan tâm trong bảng phân tích của bạn.

Đặt giá trị liên tục vào nhóm.

Sử dụng các cột boolean cho các mục "nhiều" như danh mục hoặc thẻ, ví dụ: nếu có ba thẻ "foo", "bar" và "baz", bạn sẽ có ba cột boolean.

Sử dụng chế độ xem hiện thực hóa để tạo bảng phân tích của bạn.

Lập chỉ mục ra khỏi nó. Một số cơ sở dữ liệu hỗ trợ các chỉ mục cho loại ứng dụng này.

Chỉ lọc một lần.

Liên kết kết quả của bạn.

Tạo chế độ xem được tổng hợp trước cho các truy vấn thông thường.

Bài viết này có thể giúp bạn quá: 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 

100.000 hồ sơ với 5 khía cạnh trong ~ 150 ms

Các vấn đề liên quan