2013-07-23 28 views
5

Tôi muốn các truy vấn để trả về một số điểm được tính như sau:Cách tính điểm dựa trên số lượng các thuật ngữ truy vấn trong elasticsearch?

xảy ra mỗi thuật ngữ truy vấn trong tiêu đề + Mô tả/số thuật ngữ truy vấn

ví dụ

EbSearch.add [ 
new_job(id: 1, title: "Java Programmierer", 
description: "Java Programmierer") 
] 

res = EbSearch.search("Java Programmierer").results.first.score.should == 4 

tại thời điểm đó kết quả đầu ra 8, bởi vì nó thực hiện truy vấn cho mỗi thuật ngữ và tổng kết nó. Tôi chỉ có thể phân chia sau đó, nhưng tôi không có các thuật ngữ truy vấn được phân tích, vì vậy các hợp chất có thể làm hỏng điểm số.

Các truy vấn có cấu trúc như sau:

search = Tire.search index_name do 
    query do 
    dis_max do 
     query { string query, fields: ['title^3', 'description.with_synonyms^0.5'], use_dis_max: false, default_operator: "OR" } 
     query { string query, fields: ['title^3', 'description.without_synonyms'], use_dis_max: false, default_operator: "OR"} 
    end 
    end 
end 

Bất kỳ ý tưởng làm thế nào tôi có thể giải quyết vấn đề này được đánh giá rất nhiều.

EDIT

tôi nhận ra rằng tôi cung cấp không đủ ngữ cảnh.

Dưới đây là một số đoạn trích khác mà tôi đã làm việc. Tôi đã viết một SimilarityProvider tùy chỉnh để vô hiệu hóa idf và bình thường hóa. https://gist.github.com/outsmartin/6114175

Mã lốp hoàn chỉnh được tìm thấy tại đây https://gist.github.com/6114186. Đó là một chút phức tạp hơn sau đó ví dụ, nhưng nó phải là dễ hiểu.

+0

Theo các hợp chất bạn có ý nghĩa như cụm từ tìm kiếm "tìm kiếm đàn hồi" có thể được mã hóa thành 2 mã thông báo? Bạn có muốn chia cái này cho 2 sau đó không? – ramseykhalaf

+0

Ví dụ, nhưng như tôi có rất nhiều điều khoản của Đức, tôi phải chia "Javaprogrammierer" thành Java và Programmierer. Bởi vì truy vấn được thực hiện với tất cả các điều khoản, tôi muốn điểm số nằm trong khoảng từ 0 đến 4 trong ví dụ. – outsmartin

+0

Tôi vẫn còn hơi bối rối ... Từ mô tả ở trên, tôi hiểu rằng tìm kiếm "Lập trình viên Java" phải có số điểm: (4: lần xuất hiện của mỗi cụm từ truy vấn trong tiêu đề + mô tả)/(2: số lượng cụm từ truy vấn) = 2. Nhưng bạn nói bạn muốn điểm số là 4. Tôi hơi bối rối. – ramseykhalaf

Trả lời

3

Bạn có thể dễ dàng nhận danh sách các thuật ngữ được phân tích cho truy vấn của mình bằng cách sử dụng lệnh analyze. Tuy nhiên, tôi phải đề cập đến điểm số Elasticsearch phức tạp hơn nhiều so với khi bạn chạy các bài kiểm tra của bạn trên các chỉ số nhỏ. Bạn có thể tìm công thức mà Elasticsearch đang sử dụng trong Lucene documentation và bạn có thể sử dụng lệnh explain để xem cách thức công thức này được áp dụng cho kết quả của bạn. Tôi cũng sẽ đề xuất thử nghiệm và điều chỉnh thuật toán điểm của bạn trên một chỉ mục với một phân đoạn hoặc sử dụng loại tìm kiếm dfs_query_then_fetch, tạo ra kết quả chính xác hơn trên các chỉ mục nhỏ.

+0

Tôi đã cập nhật câu hỏi với một số thông tin khác. Ý tưởng với lệnh phân tích có vẻ đầy hứa hẹn, chỉ nhược điểm là một yêu cầu khác đối với máy chủ elasticsearch. – outsmartin

+0

làm cho nó hoạt động, cảm ơn rất nhiều – outsmartin

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