2010-05-20 15 views
11

Có một chức năng tích hợp trong solr/lucene để lọc kết quả nếu chúng nằm dưới ngưỡng điểm nhất định không? Giả sử nếu tôi cung cấp ngưỡng điểm là .2, thì tất cả các tài liệu có điểm số nhỏ hơn .2 sẽ bị xóa khỏi kết quả của tôi. Trực giác của tôi là điều này là có thể bằng cách cập nhật/tùy biến solr hoặc lucene.Xóa kết quả bên dưới ngưỡng điểm nhất định trong Solr/Lucene?

Bạn có thể chỉ cho tôi hướng dẫn đúng về cách thực hiện việc này không?

Cảm ơn trước!

+3

Câu trả lời của Simon là chính xác. Nhưng hãy nhớ rằng socres là tương đối và do đó rất khó để chọn một ngưỡng cho "tốt" của kết quả. –

Trả lời

7

Bạn có thể viết Bộ sưu tập của riêng mình sẽ bỏ qua việc thu thập những tài liệu mà người ghi bàn đặt bên dưới ngưỡng của bạn. Dưới đây là một ví dụ đơn giản của việc này bằng cách sử dụng Lucene.Net 2.9.1.2 và C#. Bạn sẽ cần phải sửa đổi ví dụ nếu bạn muốn giữ điểm tính toán.

using System; 
using System.Collections.Generic; 
using Lucene.Net.Index; 
using Lucene.Net.Search; 

public class ScoreLimitingCollector : Collector { 
    private readonly Single _lowerInclusiveScore; 
    private readonly List<Int32> _docIds = new List<Int32>(); 
    private Scorer _scorer; 
    private Int32 _docBase; 

    public IEnumerable<Int32> DocumentIds { 
     get { return _docIds; } 
    } 

    public ScoreLimitingCollector(Single lowerInclusiveScore) { 
     _lowerInclusiveScore = lowerInclusiveScore; 
    } 

    public override void SetScorer(Scorer scorer) { 
     _scorer = scorer; 
    } 

    public override void Collect(Int32 doc) { 
     var score = _scorer.Score(); 
     if (_lowerInclusiveScore <= score) 
      _docIds.Add(_docBase + doc); 
    } 

    public override void SetNextReader(IndexReader reader, Int32 docBase) { 
     _docBase = docBase; 
    } 

    public override bool AcceptsDocsOutOfOrder() { 
     return true; 
    } 
} 
+0

Cảm ơn Simon. Điều này thực sự đã giúp tôi hiểu rõ hơn về cách thực hiện nó. @Shashikant - cảm ơn bạn đã chia sẻ suy nghĩ của mình. Tôi sẽ ghi nhớ điều đó. Tôi sẽ thận trọng hơn trong việc thiết lập ngưỡng để có cơ hội nhỏ mà tôi lọc ra các kết quả có liên quan. – snickernet

4

Gọi là điểm chuẩn hóa (Scores As Percentages).

Bạn có thể sử dụng các thông số sau sau đây để đạt được điều đó:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100) 
fq = {!frange l=20}$ns 

đâu 20 là ngưỡng 20% ​​của bạn.

liên quan: how do I normalise a solr/lucene score?


tôi sẽ không khuyên bạn nên làm điều này vì giá trị số tuyệt đối trong Lucene là không có ý nghĩa (ví dụ: điểm không so sánh trực tiếp trên tìm kiếm). Tỷ lệ điểm số với điểm số cao nhất được trả về là có ý nghĩa, nhưng không có hiệu chuẩn tuyệt đối cho điểm số cao nhất trả lại, ít nhất là hiện tại, vì vậy không có cách nào để xác định từ điểm chất lượng của kết quả thiết lập là tổng thể. Có các cách tiếp cận khác nhau để cải thiện điều này đã được thảo luận (làm cho điểm số có thể so sánh trực tiếp hơn bằng cách mã hóa thông tin bổ sung vào điểm số và sử dụng nó để chuẩn hóa hoặc có thể tốt hơn, khái quát điểm số cho đối tượng chứa nhiều phần thông tin; ví dụ: tổng số cụm từ truy vấn được kết hợp bởi kết quả hàng đầu nếu bạn đang sử dụng OR mặc định sẽ khá hữu ích). Không có ai trong số những ý tưởng này được triển khai theo như tôi biết. - @Chuck

Nguồn: RE: Limiting Hits with a score threshold

liên quan: Re: A question about scoring function in Lucene

0

Chỉ cần một bản cập nhật cho bất cứ ai tình cờ ở đây - một EarlyTerminatingSortCollector đã được cung cấp bởi Lucene và một nhà sưu tập tùy chỉnh không cần phải làm cho điều này nữa. Bọc nó trên TopDocsCollector (trong trường hợp cụ thể của OP, TopScoreDocCollector) để đạt được nhiệm vụ nhất định.

EarlyTerminatingSortCollector

Một Collector rằng sớm kết thúc bộ sưu tập các tài liệu trên một cơ sở cho mỗi phân đoạn, nếu phân khúc được sắp xếp theo Sắp xếp nhất định.

TopDocsCollector

Một lớp cơ sở cho tất cả các nhà sưu tập mà trả về một kết quả TopDocs. Bộ sưu tập này cho phép mở rộng dễ dàng bằng cách cung cấp một hàm tạo duy nhất chấp nhận một PriorityQueue cũng như các thành viên được bảo vệ cho hàng đợi ưu tiên đó và một bộ đếm của tổng số lần truy cập.

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