2011-05-25 28 views
10

Tôi có truy vấn đang thực hiện ILIKE trên một số trường chuỗi 11 hoặc văn bản của bảng không lớn (500 000), nhưng đối với ILIKE rõ ràng là quá lớn, truy vấn tìm kiếm mất 20 giây. Cơ sở dữ liệu là postgres 8.4Hibernate Search, Lucene hoặc bất kỳ giải pháp thay thế nào khác?

Tôi cần triển khai tìm kiếm này nhanh hơn nhiều.

gì lóe lên trong óc tôi:

  1. tôi làm cột TVECTOR thêm được lắp ráp từ tất cả các cột mà cần phải được tìm kiếm và tạo ra các chỉ mục văn bản đầy đủ về nó. Tìm kiếm toàn văn khá nhanh. Nhưng ... Tôi không thể ánh xạ loại TVECTOR này trong .hbms của tôi. Vì vậy, ý tưởng này đã giảm (trong mọi trường hợp tôi thaught nó nhiều hơn như là một giải pháp tạm thời).

  2. Tìm kiếm Hibernate. (Nghe nói về nó lần đầu tiên ngày hôm nay) Nó có vẻ promissing, nhưng tôi cần ý kiến ​​kinh nghiệm về nó, vì tôi không muốn nhận được vào API mới, có thể không phải là đơn giản nhất, cho một cái gì đó có thể được thực hiện đơn giản.

  3. Lucene

Trong mọi trường hợp, điều này đã xảy ra bây giờ với bảng này, nhưng tôi muốn giải pháp là chung chung hơn và áp dụng đối với trường hợp trong tương lai liên quan đến tìm kiếm văn bản đầy đủ.

Tất cả lời khuyên được đánh giá cao!

Thanx

Trả lời

12

Tôi rất muốn giới thiệu Hibernate Search, cung cấp cầu nối rất dễ sử dụng giữa Hibernate và Lucene. Nhớ rằng bạn sẽ sử dụng cả hai ở đây. Bạn chỉ cần chú thích các thuộc tính trên các lớp miền mà bạn muốn có thể tìm kiếm trên đó. Sau đó, khi bạn cập nhật/chèn/xóa một thực thể được kích hoạt để tìm kiếm Hibernate Search, chỉ cần cập nhật các chỉ mục liên quan. Điều này sẽ chỉ xảy ra nếu giao dịch trong đó thay đổi cơ sở dữ liệu xảy ra đã được cam kết tức là nếu nó được khôi phục thì các chỉ mục sẽ không bị hỏng.

Vì vậy, để giải đáp thắc mắc của bạn:

  1. Có bạn có thể chỉ số cột cụ thể trên bảng cụ thể. Bạn cũng có khả năng Mã hóa nội dung của trường để bạn có thể khớp trên các phần của trường.

  2. Thật khó để sử dụng chút nào, bạn chỉ cần tìm ra những thuộc tính bạn muốn tìm kiếm. Nói với Hibernate nơi để giữ chỉ mục của nó. Và sau đó có thể sử dụng giao diện EntityManager/Session để tải các thực thể bạn đã tìm kiếm.

+0

thanx để giải thích, một câu hỏi ngắn nữa, tôi muốn có thể tìm kiếm trên vài trường chuỗi. Liệu nó có ý nghĩa để lưu trữ tất cả các trường khác vào chỉ mục, nhưng không thể tìm kiếm được, và sau đó khi tôi nhấn, tôi lấy đối tượng từ đó, hoặc tôi chỉ cần lấy IDS và vào cơ sở dữ liệu để lấy chúng ? – Julia

+0

@Julia Bạn chỉ nên lập chỉ mục các trường mà bạn muốn tìm kiếm. Bạn nói với Hibernate Search cái @DocumentId (cũng là @Id) của thực thể được lập chỉ mục là gì. Hibernate sau đó sẽ sử dụng id này để có được thực thể từ cơ sở dữ liệu (hoặc bộ nhớ cache phiên) mà bạn không lo lắng về nó. Trong thực tế, Hibernate Search có một chuỗi tìm kiếm và trả về cho bạn các thực thể miền phù hợp với tìm kiếm đó. Neat huh? –

+0

gọn gàng thực sự, thanx! – Julia

0

Tôi khuyên bạn nên Compass. Đó là một dự án mã nguồn mở được xây dựng trên đầu trang của Lucene cung cấp một API đơn giản hơn (so với Lucene). Nó tích hợp độc đáo với nhiều thư viện Java phổ biến và các khung công tác như Spring và Hibernate.

0

Tôi đã sử dụng Lucene trong quá khứ để lập chỉ mục các bảng cơ sở dữ liệu. Các giải pháp hoạt động tuyệt vời, nhưng nhớ rằng bạn cần phải duy trì chỉ mục. Hoặc là, bạn cập nhật chỉ mục mỗi lần các đối tượng của bạn được duy trì hoặc bạn có một trình lập chỉ mục daemon đổ các bảng cơ sở dữ liệu trong chỉ mục Lucene của bạn.

Bạn đã xem xét Solr? Nó được xây dựng trên đầu trang của Lucene và cung cấp chỉ mục tự động từ một DB và một API Rest.

+0

thanx. chúng tôi đã sử dụng lucene để lập chỉ mục tài liệu, vì vậy tôi thaught tốt hơn vào cùng một thư viện. Làm thế nào nó sẽ có thể với Lucene, ví dụ, tôi muốn lập chỉ mục một số quan hệ của các đối tượng? Tôi có phải lập chỉ mục toàn bộ bảng, hoặc tôi có thể làm các cột cụ thể mà tôi cần từ bảng chính và một số quan hệ của nó? – Julia

+0

Cách tôi đã làm, là sử dụng các truy vấn SELECT với JOINS để tạo cấu trúc "phẳng" của dữ liệu của tôi để tôi có thể chạy trình chỉ mục trên chúng. Đây là một cách tiếp cận. Bạn cũng có thể sử dụng các thủ tục được lưu trữ để làm phẳng dữ liệu của bạn thành một bảng đặc biệt được sử dụng cho mục đích lập chỉ mục –

0

Tất cả các dự án đều dựa trên Lucene. Nếu bạn muốn thực hiện một tính năng rất tiên tiến, tôi khuyên bạn nên sử dụng Lucene trực tiếp. Nếu không, bạn có thể sử dụng Solr là một API mạnh mẽ trên đầu trang của lucene có thể giúp bạn lập chỉ mục và tìm kiếm từ DB.

+0

tôi sẽ không cần các tính năng nâng cao mà tôi nghĩ, nhưng muốn tránh sử dụng thư viện mới mà chúng tôi không sử dụng cho đến nay. Tôi không chắc tôi hiểu lý do tại sao bạn đề nghị Solr - đó là trong mọi trường hợp được xây dựng trên lucene? Bạn có thể làm rõ hơn một chút được không? Thanx bạn !!! – Julia

+0

Tôi cung cấp cho bạn một ví dụ: bạn phải thực hiện cuộc gọi http đến máy chủ web. Trong java có thư viện socket giúp bạn làm điều đó, nhưng có tốt hơn: apache commons http client. Nó chính xác đi kèm với các thư viện được xây dựng trong thực hiện giao thức. Điều tương tự cho Solr có tích hợp API để quản lý các chỉ mục, tìm kiếm văn bản đầy đủ dễ dàng với tích hợp cơ sở dữ liệu dễ dàng và được thiết kế để chạy một thùng chứa servlet. –

6

Vì bạn đã sử dụng Hibernate và Lucene, Hibernate Search là một lựa chọn tuyệt vời.

Tìm kiếm Hibernate chủ yếu cung cấp là một cơ chế để các chỉ mục Lucene của bạn được cập nhật khi dữ liệu được thay đổi và khả năng tối đa hóa những gì bạn đã biết về Hibernate để đơn giản hóa các tìm kiếm của bạn chống lại các chỉ mục Lucene.

Bạn sẽ có thể chỉ định trường cụ thể trong mỗi thực thể bạn muốn được lập chỉ mục, cũng như thêm nhiều loại chỉ mục nếu cần (ví dụ: văn bản gốc và toàn văn). Bạn cũng sẽ có thể quản lý để lập chỉ mục biểu đồ cho các liên kết để bạn có thể thực hiện các truy vấn khá phức tạp thông qua Tìm kiếm/Lucene.

Tôi thấy rằng tốt nhất nên dựa vào Tìm kiếm Hibernate cho tìm kiếm văn bản nặng, nhưng trở lại Hibernate cũ để tìm kiếm truyền thống và để hydrating đồ thị đối tượng phức tạp cho hiển thị kết quả.

0

Một năm trước, tôi đã đề xuất La bàn. Nó là tốt ở những gì nó làm, và về mặt kỹ thuật vẫn hạnh phúc chạy dọc theo trong các ứng dụng tôi phát triển và duy trì.

Tuy nhiên, không còn phát triển nào nữa trên La bàn, với những nỗ lực đã chuyển sang ElasticSearch. Từ trang web của dự án đó, tôi hoàn toàn không thể xác định xem nó đã sẵn sàng cho Big Time chưa hay thậm chí còn sống.

Vì vậy, tôi chuyển sang Hibernate Search, điều này không mang lại cho tôi cảm giác tốt nhưng việc di chuyển vẫn đang ở giai đoạn ban đầu, vì vậy tôi sẽ dành thời gian chờ đợi lâu hơn.

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