2012-12-06 23 views
5

Tôi đang cố gắng hiểu rõ hơn về cách lucene ghi tìm kiếm của tôi để tôi có thể thực hiện các chỉnh sửa cần thiết cho cấu hình tìm kiếm hoặc nội dung tài liệu của mình.Điểm số solr/lucene idf

Phần dưới đây là một phần của bảng phân tích điểm số.

sản phẩm của:

0.34472802 = queryWeight, product of: 
     2.2 = boost 
     7.880174 = idf(docFreq=48, maxDocs=47667) 
     0.019884655 = queryNorm 
     1.9700435 = fieldWeight in 14363, product of: 
     1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
     7.880174 = idf(docFreq=48, maxDocs=47667) 
     0.25 = fieldNorm(doc=14363) 
0.26806915 = (MATCH) max of: 
    0.07832639 = (MATCH) weight(shortDescription:tires^1.1 in 14363) [DefaultSimilarity], result of: 
    0.07832639 = score(doc=14363,freq=1.0 = termFreq=1.0 

tôi hiểu làm thế nào tăng được tính như đó là giá trị cấu hình của tôi

Nhưng làm thế nào được IDF tính (7,880174 = giá trị idf).

Theo Lucene, công thức idf là: idf (t) = 1 + log (numDocs/(docFreq + 1))

Tôi đã kiểm tra cốt lõi quản trị giao diện điều khiển và phát hiện ra rằng tôi docFreq = maxDocs = 47.667

Sử dụng công thức từ lucene, tôi không thể tính toán được dự kiến ​​là 7.880174. Thay vào đó tôi nhận được: idf = 3.988 = 1 + log (47667/(48 + 1)).

Có điều gì đó tôi thiếu trong công thức của tôi.

Trả lời

6

Tôi nghĩ log của bạn chức năng chọn 10 làm cơ sở trong khi trong lucene chúng tôi chọn e làm cơ sở.

log(47667/(48+1), 10) = 2.9880217397306 
log(47667/(48+1), e) = 6.8801743154459 

Mã nguồn của idf phương pháp Lucene là:

public float idf(int docFreq, int numDocs) { 
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0); 
    } 

Như bạn thấy, idf sử dụng Java Math.log để tính toán idf khi Math.log chọn e như log chức năng. Xem Java Math api để biết chi tiết.

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