2008-08-29 33 views
15

Giả sử rằng tôi có một trường có tên là giá đối với các tài liệu trong Solr và tôi có trường đó. Tôi muốn nhận được các khía cạnh như phạm vi giá trị (ví dụ: 0-100, 100-500, 500-1000, v.v.). Làm thế nào để làm nó?Làm thế nào để có được các phạm vi khía cạnh trong kết quả solr?

Tôi có thể chỉ định phạm vi trước, nhưng tôi cũng muốn biết liệu có thể tính toán phạm vi (tự động nói 5 giá trị) dựa trên các giá trị trong tài liệu không?

Trả lời

4

Có thể có một câu trả lời cụ thể hơn về Solr, nhưng tôi làm việc với Lucene thẳng, và vì bạn không nhận được nhiều lực kéo, tôi sẽ bị đâm. Ở đó, tôi sẽ tạo một mã số Filter với FilteredQuery gói Query gốc. Sau đó, tôi sẽ nhận được một FieldCache cho lĩnh vực quan tâm. Liệt kê các lần truy cập trong bitet của bộ lọc và cho mỗi lần truy cập, bạn sẽ nhận được giá trị của trường từ bộ nhớ cache của trường và thêm nó vào một SortedSet. Khi bạn đã có tất cả các lần truy cập, hãy chia kích thước của tập hợp thành số dãy bạn muốn (năm đến bảy là số tốt theo người giao diện người dùng) và thay vì ràng buộc một giá trị, các khía cạnh của bạn sẽ là một truy vấn phạm vi có giới hạn dưới và trên của mỗi tập con đó.

Tôi khuyên bạn nên sử dụng một số logic đặc biệt cho một số lượng nhỏ các giá trị; rõ ràng, nếu bạn chỉ có bốn giá trị riêng biệt, bạn không nên thử và thực hiện 5 sàng lọc phạm vi trong số đó. Bên dưới ngưỡng nhất định (giả sử 3 * số phạm vi lý tưởng của bạn), bạn chỉ hiển thị các khía cạnh bình thường thay vì phạm vi.

14

Để trả lời câu hỏi đầu tiên của bạn, bạn có thể nhận được các phạm vi khía cạnh bằng cách sử dụng hỗ trợ truy vấn khía cạnh chung. Here 's một ví dụ:

http://localhost:8983/solr/select?q=video&rows=0&facet=true&facet.query=price:[*+TO+500]&facet.query=price:[500+TO+*] 

Đối với câu hỏi thứ hai của bạn (tự động đề xuất phạm vi khía cạnh), chưa được triển khai. Một số người cho rằng loại truy vấn này sẽ được triển khai tốt nhất trên ứng dụng của bạn thay vì cho phép Solr "đoán" các phạm vi khía cạnh tốt nhất.

Dưới đây là một số cuộc thảo luận về chủ đề này:

+1

Có thể trễ sáu năm, nhưng các liên kết không hoạt động nữa. – Bucket

+1

@DesertIvy Bằng mọi cách, hãy xem chúng trên archive.org hoặc ở một nơi khác và chỉnh sửa câu trả lời. –

+0

Wow, thậm chí không biết rằng tồn tại. Công cụ tuyệt vời! – Bucket

6

Tôi đã tìm hiểu cách tính các khía cạnh động hợp lý cho phạm vi giá sản phẩm. Giải pháp bao gồm một số xử lý trước các tài liệu và một số hậu xử lý các kết quả truy vấn, nhưng nó chỉ yêu cầu một truy vấn tới Solr, và thậm chí nên làm việc trên phiên bản cũ của Solr như 1.4.

Vòng lên giá trước khi trình

Thứ nhất, trước khi trình các tài liệu, tròn lên các giá để các "nice ranh giới quanh khía cạnh" gần nhất và lưu trữ nó trong một lĩnh vực "rounded_price". Người dùng thích khía cạnh của họ trông giống như "250-500" không phải "247-483", và làm tròn cũng có nghĩa là bạn lấy lại hàng trăm khía cạnh giá chứ không phải hàng triệu khía cạnh.Với một số nỗ lực mã sau đây có thể được khái quát hóa để làm tròn độc đáo tại bất kỳ quy mô giá:

public static decimal RoundPrice(decimal price) 
    { 
     if (price < 25) 
      return Math.Ceiling(price); 
     else if (price < 100) 
      return Math.Ceiling(price/5) * 5; 
     else if (price < 250) 
      return Math.Ceiling(price/10) * 10; 
     else if (price < 1000) 
      return Math.Ceiling(price/25) * 25; 
     else if (price < 2500) 
      return Math.Ceiling(price/100) * 100; 
     else if (price < 10000) 
      return Math.Ceiling(price/250) * 250; 
     else if (price < 25000) 
      return Math.Ceiling(price/1000) * 1000; 
     else if (price < 100000) 
      return Math.Ceiling(price/2500) * 2500; 
     else 
      return Math.Ceiling(price/5000) * 5000; 
    } 

giá được phép đi 1,2,3, ..., 24,25,30,35, ..., 95.100.110 , ..., 240,250,275,300,325, ..., 975,1000 và v.v.

Nhận tất cả các khía cạnh về giá tròn

Thứ hai, khi nộp các truy vấn, yêu cầu tất cả các khía cạnh về giá tròn được sắp xếp theo giá: facet.field=rounded_price. Nhờ làm tròn, bạn sẽ nhận được nhiều nhất vài trăm khía cạnh.

Kết hợp các khía cạnh liền kề vào khía cạnh lớn hơn

Thứ ba, sau khi bạn có kết quả, người dùng muốn thấy chỉ 3-7 khía cạnh, chứ không phải hàng trăm khía cạnh. Vì vậy, kết hợp các khía cạnh liền kề thành một vài khía cạnh lớn (được gọi là "phân đoạn") cố gắng để có được số lượng tài liệu gần như bằng nhau trong mỗi phân đoạn. Đoạn mã phức tạp hơn sau đây thực hiện điều này, trả về các bộ dữ liệu (bắt đầu, kết thúc, đếm) phù hợp để thực hiện các truy vấn phạm vi. Các tội trở lại sẽ là giá cung cấp đúng được được làm tròn lên đến ranh giới gần nhất:

public static List<Tuple<string, string, int>> CombinePriceFacets(int nSegments, ICollection<KeyValuePair<string, int>> prices) 
    { 
     var ranges = new List<Tuple<string, string, int>>(); 
     int productCount = prices.Sum(p => p.Value); 
     int productsRemaining = productCount; 
     if (nSegments < 2) 
      return ranges; 
     int segmentSize = productCount/nSegments; 
     string start = "*"; 
     string end = "0"; 
     int count = 0; 
     int totalCount = 0; 
     int segmentIdx = 1; 
     foreach (KeyValuePair<string, int> price in prices) 
     { 
      end = price.Key; 
      count += price.Value; 
      totalCount += price.Value; 
      productsRemaining -= price.Value; 
      if (totalCount >= segmentSize * segmentIdx) 
      { 
       ranges.Add(new Tuple<string, string, int>(start, end, count)); 
       start = end; 
       count = 0; 
       segmentIdx += 1; 
      } 
      if (segmentIdx == nSegments) 
      { 
       ranges.Add(new Tuple<string, string, int>(start, "*", count + productsRemaining)); 
       break; 
      } 
     } 
     return ranges; 
    } 

Lọc kết quả theo khía cạnh chọn

Thứ tư, giả sử ("250", "500", 38) là một trong các phân đoạn kết quả. Nếu người dùng chọn "$ 250 đến $ 500" làm bộ lọc, chỉ cần thực hiện truy vấn bộ lọc fq=price:[250 TO 500]

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