2013-07-12 40 views
5

Vấn đề của tôi là tôi có n trường (khoảng 10) trong Solr có thể tìm kiếm được, tất cả chúng đều được lập chỉ mục và lưu trữ. Tôi muốn chạy một truy vấn đầu tiên trên toàn bộ chỉ mục của tôi nói 5000 tài liệu mà sẽ đạt khoảng trung bình 500 tài liệu. Tiếp theo, tôi muốn truy vấn bằng cách sử dụng một tập hợp từ khóa khác trên 500 tài liệu này và KHÔNG trên toàn bộ chỉ mục. Vì vậy, lần đầu tiên tôi gửi một truy vấn một số điểm sẽ được tạo, lần thứ hai tôi chạy một truy vấn số điểm mới được tạo nên dựa trên 500 tài liệu của truy vấn trước đó, hoặc nói cách khác Solr chỉ nên xem xét những 500 tài liệu là toàn bộ chỉ mục.Nhiều truy vấn trong Solr

Để tóm tắt điều này, chỉ mục 5000 sẽ được lọc thành 500 và sau đó là 50 (5000> 500> 50). Về cơ bản nó lọc nhưng tôi muốn làm điều này trong Solr.

Tôi có kiến ​​thức cơ bản hợp lý và vẫn đang học.

Cập nhật: Nếu đại diện về mặt toán học nó sẽ trông như thế này:

results1=f(query1) 
results2=f(query2, results1) 
final_results=f(query3, results2) 

Tôi muốn này được thực hiện bằng một chương trình và người dùng cuối sẽ chỉ nhìn thấy 50 kết quả. Vì vậy, faceting không phải là một lựa chọn.

Trả lời

3

Filter queries (fq) được thiết kế đặc biệt để hạn chế nhanh chóng của tập kết quả bằng cách không thực hiện bất kỳ phép tính điểm nào.

Vì vậy, nếu bạn đặt truy vấn đầu tiên của mình vào thông số fq và truy vấn tạo điểm số thứ hai của bạn trong thông số 'q' bình thường, nó sẽ làm những gì bạn yêu cầu.

Xem thêm a question discussing this issue from the opposite direction.

+0

Thanx Alexandre, dựa trên thử nghiệm ban đầu của tôi, tôi có thể nói rằng nó giải quyết vấn đề của tôi. Ngoài ra tôi thấy thời gian thực hiện là ít hơn rất nhiều so với giải pháp của Gus. Một sự kết hợp của giải pháp của bạn và Gus nên giải quyết vấn đề của tôi một cách toàn diện. – user2575429

0

Nên xem "tìm kiếm mặt" từ Solr: http://wiki.apache.org/solr/SolrFacetingOverview Điều này sẽ giúp bạn trong loại tìm kiếm "lặp lại" này.

+0

Hey thanx, tôi biết về các khía cạnh nhưng tôi không muốn sử dụng nó. Phần khoan, tôi muốn làm điều đó trong một chương trình. Người dùng cuối sẽ chỉ thấy tập cuối cùng của 50 kết quả và không có gì khác. Sau truy vấn đầu tiên tôi muốn chạy truy vấn thứ hai trên các kết quả thu được với các tham số hoàn toàn khác nhau. – user2575429

2

Tôi tin rằng bạn muốn sử dụng một truy vấn lồng nhau như thế này:

text:"roses are red" AND _query_:"type:poems" 

Bạn có thể đọc thêm về truy vấn lồng nhau ở đây:

http://searchhub.org/2009/03/31/nested-queries-in-solr/

+0

Thanx Gus, tôi nghĩ rằng đây là một cách tiếp cận tốt cho yêu cầu của tôi và tôi khám phá nhiều hơn về nó, sẽ làm một số thử nghiệm và xem nó hoạt động như thế nào. Tôi đánh giá cao sự giúp đỡ của bạn. – user2575429

5

Hai triển khai có khả năng xảy ra đối với tôi. Cách tiếp cận đơn giản nhất là chỉ cần thêm truy vấn đầu tiên vào truy vấn thứ hai;

+(first query) +(new query) 

Đây là cách tiếp cận tốt nếu truy vấn đầu tiên bạn muốn lọc thường xuyên thay đổi. Nếu truy vấn đầu tiên là một cái gì đó giống như một loại tài liệu, hoặc một cái gì đó tương tự, nơi bạn có thể được hưởng lợi từ việc tái sử dụng các bộ lọc tương tự, sau đó một truy vấn lọc là cách tiếp cận tốt hơn, sử dụng fq parameter, một cái gì đó như:

q=field:query2&fq=categoryField:query1 

lọc truy vấn bộ nhớ cache một tập hợp các id tài liệu để lọc, do đó, đối với các tìm kiếm thường được sử dụng, như danh mục, phạm vi ngày phổ biến, v.v ..., có thể thu được lợi ích hiệu suất đáng kể từ đó (đối với tìm kiếm không phổ biến hoặc chuỗi tìm kiếm do người dùng nhập, chỉ cần phải trả phí không cần thiết để lưu trữ kết quả và gây ô nhiễm bộ nhớ cache với tập hợp kết quả vô dụng)