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ó thể trễ sáu năm, nhưng các liên kết không hoạt động nữa. – Bucket
@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. –
Wow, thậm chí không biết rằng tồn tại. Công cụ tuyệt vời! – Bucket