2010-06-23 18 views
6

Tôi muốn kết quả tìm kiếm của tôi theo thứ tự theo điểm số, mà họ đang làm, nhưng điểm số đang được tính toán không đúng. Điều này có nghĩa là, không nhất thiết phải không đúng cách, nhưng khác với dự kiến ​​và tôi không chắc chắn lý do. Mục tiêu của tôi là xóa mọi thứ đang thay đổi điểm số.Solr: fieldNorm khác nhau cho mỗi tài liệu, không có tài liệu tăng

Nếu tôi thực hiện tìm kiếm khớp với hai đối tượng (nơi ObjectA được dự kiến ​​có điểm số cao hơn ObjectB), thì ObjectB sẽ được trả về trước.

Ví dụ: truy vấn của tôi là một cụm từ duy nhất: "táo".

ObjectA của tiêu đề: "táo là quả táo" (2/3 về) Mô tả
ObjectA của: "Có những quả táo trong những quả táo-táo và bây giờ những quả táo đã đi tất cả táo trên tất cả các quả táo" (6/18 terms)
Tiêu đề của ObjectB: "quả táo là tuyệt vời" (1/3 cụm từ)
Mô tả của ObjectB: "Có những quả táo trong phòng táo và bây giờ những quả táo đã bị hỏng trên tất cả các quả táo!" (4/18 terms)

Trường tiêu đề không có tăng (hoặc đúng hơn là tăng 1) và trường mô tả có mức tăng 0,8. Tôi đã không chỉ định một tài liệu được tăng thông qua solrconfig.xml hoặc thông qua truy vấn mà tôi đang đi qua. Nếu có một cách khác để chỉ định tăng tài liệu, có khả năng tôi thiếu một tài liệu.

Sau khi phân tích explain bản in, có vẻ như ObjectA tính đúng một điểm số cao hơn so với ObjectB, giống như tôi muốn, trừ một khác biệt: Tiêu đề fieldNorm ObjectB luôn cao hơn ObjectA của.


Dưới đây là bản in explain. Chỉ cần để bạn biết: lĩnh vực tiêu đề là mditem5_tns và lĩnh vực mô tả là mditem7_tns:

ObjectB: 
1.3327172 = (MATCH) sum of: 
    1.0352166 = (MATCH) max plus 0.1 times others of: 
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of: 
     0.53929156 = queryWeight(mditem5_tns:appl), product of: 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of: 
     1.0 = tf(termFreq(mditem5_tns:appl)=1) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     1.0 = fieldNorm(field=mditem5_tns, doc=0) 
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of: 
     0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of: 
     0.8 = boost 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of: 
     2.0 = tf(termFreq(mditem7_tns:appl)=4) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.375 = fieldNorm(field=mditem7_tns, doc=0) 
    0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of: 
    0.999001 = 1000.0/(1.0*float(1)+1000.0) 
    1.0 = boost 
    0.2977981 = queryNorm 

ObjectA: 
1.2324848 = (MATCH) sum of: 
    0.93498427 = (MATCH) max plus 0.1 times others of: 
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of: 
     0.53929156 = queryWeight(mditem5_tns:appl), product of: 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of: 
     1.4142135 = tf(termFreq(mditem5_tns:appl)=2) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.625 = fieldNorm(field=mditem5_tns, doc=0) 
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of: 
     0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of: 
     0.8 = boost 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of: 
     2.4494898 = tf(termFreq(mditem7_tns:appl)=6) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.375 = fieldNorm(field=mditem7_tns, doc=0) 
    0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of: 
    0.999001 = 1000.0/(1.0*float(1)+1000.0) 
    1.0 = boost 
    0.2977981 = queryNorm 

Trả lời

6

vấn đề là do Stemmer. Nó mở rộng "táo là táo" để "táo app là táo app" do đó làm cho trường dài hơn. Vì tài liệu B chỉ chứa 1 thuật ngữ đang được mở rộng bởi phần tử gốc, trường này sẽ ngắn hơn sau đó tài liệu A.

Kết quả này trong các fieldNorms khác nhau.

+0

Bạn có thể xây dựng, hoặc có thể cung cấp một liên kết? Tại sao "stemmer" sẽ mở rộng lĩnh vực của tôi để một cái gì đó mà nó * không *? Điều đó có vẻ phản trực giác! :) – JMTyler

+0

Trừ khi "appl" đầu tiên bạn viết được cho là "quả táo"? Chỉ cần nhìn vào gốc, điều đó sẽ có ý nghĩa, nếu "táo" đang được chia nhỏ thành dạng gốc của nó. Vì vậy, hãy cho tôi biết nếu tôi có quyền này - bạn đang nói rằng nếu tôi thay đổi tất cả các tham chiếu đến "quả táo" và chỉ tìm kiếm "quả táo", tôi sẽ nhận được kết quả theo thứ tự tôi muốn? – JMTyler

+0

Tôi đã chỉnh sửa bài đăng của mình, vì vậy nó sẽ rõ ràng hơn bây giờ. Thân cây sử dụng "appl" dưới dạng root cho "apple" và "apple". Vì vậy, nếu bạn vô hiệu hóa xuất phát, bạn sẽ nhận được kết quả mong đợi. Bạn cũng có thể loại trừ các cụm từ không được bắt đầu bằng cách thêm chúng vào protwords.txt và thay đổi schema.xml Jem

2

FieldNOrm được tính của 3 thành phần - chỉ số thời gian tăng trên các lĩnh vực, chỉ số thời gian tăng vào độ dài văn bản và lĩnh vực. Giả sử rằng bạn không cung cấp bất kỳ tăng thời gian chỉ mục nào, sự khác biệt phải là độ dài trường.

Như vậy, kể từ lengthNorm là cao hơn đối với giá trị trường ngắn hơn, cho B để có một giá trị fieldNorm cao cho danh hiệu, nó phải có số lượng nhỏ hơn các thẻ trong tiêu đề hơn A.

Xem các trang sau cho một giải thích chi tiết của Lucene điểm:

http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity.html

+0

+1 cho nhiều thông tin chi tiết - cảm ơn! Thật không may, tuy nhiên, bạn sẽ nhận thấy trong bài viết của tôi mà tôi đã nói những gì các lĩnh vực (và độ dài của họ) được. Cả hai đối tượng có tiêu đề với 3 thẻ và mô tả với 18 thẻ.Tiêu đề của ObjectA có 2/3 mã thông báo khớp, ObjectB có 1/3 khớp, và các mô tả khớp tương ứng là 6/18 và 4/18. Vì vậy, nếu tôi hiểu những gì bạn đang nói, lengthNorm không nên có bất kỳ tác dụng. Tôi có thể hỏi - làm thế nào tôi sẽ đi về việc thiết lập tăng thời gian chỉ số? – JMTyler

+0

Xin lỗi - Tôi nghĩ rằng ví dụ của bạn đã được tạo thành chứ không phải giá trị thực tế. Trong trường hợp đó bạn đúng trong chiều dài trường đó không phải là một yếu tố. Bạn có thể thiết lập boost trong Solr theo nhiều cách khác nhau - Nếu bạn đang sử dụng SolrJ, tôi tin rằng có một phương thức "setBoost" trên SolrInputDocument. Nhưng nếu Doc B được tăng cường thì fieldNorm cũng sẽ cao hơn trong trường mô tả. Bạn cũng có thể muốn kiểm tra Luke - nó cho phép bạn xây dựng lại dữ liệu trường được lập chỉ mục của bạn để bạn có thể thấy những gì thực sự được lập chỉ mục. – KenE

+0

Không, không được tạo - chỉ cần kiểm tra dữ liệu. :) Tôi sẽ xem xét mã và xem liệu có bất kỳ điều gì đáng ngờ đang xảy ra với tăng thời gian chỉ mục hay không. Có lẽ tôi cũng sẽ kiểm tra Luke. Cảm ơn đã giúp đỡ. – JMTyler

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