14

Tôi đã thực hiện truy vấn phức tạp bằng cách sử dụng tính phổ biến để cải thiện kết quả của tài liệu truyền thông xã hội bằng cách sử dụng Elasticsearch. Truy vấn hoạt động thực sự tốt và kết quả hàng đầu luôn tập trung vào truy vấn và với các yếu tố thú vị.Kết quả đa dạng về tìm kiếm Elasticsearch

Tuy nhiên, có một vấn đề, đối với một số truy vấn, kết quả đầu tiên là tất cả từ cùng một người dùng.

Tôi muốn điểm dưới tài liệu nếu cùng một người dùng được truy lục trên tài liệu cao hơn. Bằng cách này, tôi hy vọng sẽ có sự đa dạng hơn về kết quả.

Lưu ý rằng tôi không muốn chúng bị xóa, vì trong một số trường hợp, vẫn có thể thú vị khi tìm thêm tài liệu của cùng một người dùng, nhưng tôi muốn chúng ở vị trí thấp hơn.

Ai có thể đề xuất một cách để làm cho nó hoạt động?


Như đã đề cập trong một số ý kiến ​​tôi cập nhật một (phiên bản đơn giản) truy vấn của tôi:

query = {"function_score": { 
    "functions": [ 
    {"gauss": {"createdAt": 
     {"origin": "now", "scale": "30d", "offset": "7d", "decay" :0.9 } 
    }}, 
    {"gauss": {"shares.last.twitter_retweets_log": 
     {"origin": 4.52, "scale": 2.61, "decay" : 0.9} 
    }}, 
    ], 
    "query": {"bool":{"must":[ 
    {"exists":{"field": "images"}}, 
    {"multi_match":{"query": "foo boo", fields:["text", "link.title"]}} 
    ]}}, 
    "score_mode": "multiply" 
}}; 

PS: một số tài liệu mà bạn có thể thú vị, như họ nói về sự đa dạng, nhưng tôi không chắc chắn làm thế nào để áp dụng:

+2

Bạn có thể hiển thị truy vấn thực tế của mình và một số kết quả bạn hiện đang nhận được không? Ngoài ra, loại trường mô tả người dùng của bạn (ví dụ: chuỗi hoặc số) là gì? – Val

+0

@Val Tôi đang sử dụng Truy vấn Điểm chức năng trên elasticSearch 2.1. User.id là một chuỗi. –

+0

Bạn có phiền khi chia sẻ truy vấn thực tế của mình không? – Val

Trả lời

7

Bạn có thể ghép mẫu với tập hợp top_hits để nhận kết quả đa dạng.

{ 
    "query": { 
     "match": { 
      "query": "iphone" 
     } 
    }, 
    "size":0, 
    "aggs": { 
     "sample": { 
      "sampler": { 
       "shard_size": 200, 
       "field" : "user.id"     
      }, 
      "aggs": { 
       "diversifiedMatches": { 
        "top_hits": { 
         "size":10 
        } 
       } 
      } 
     } 
    } 
} 

Có một số hãy cẩn thận ví dụ:

1) pc là mỗi mảnh vỡ không toàn cầu

2) Lựa chọn lĩnh vực đa dạng hóa phải là một đơn giá trị trường

3) Không hỗ trợ cho phân trang

4) Không hỗ trợ để phân loại trên bất kỳ điều gì khác ngoài điểm số

Việc giải quyết các vấn đề trên sẽ khó khăn và đòi hỏi phải có sự phối hợp tốn kém/phức tạp trong nội bộ cộng thêm hướng dẫn của khách hàng về thời gian và địa điểm có thể tái xuất kết quả "trùng lặp" (trang 2? trang 3? bao nhiêu?), v.v.

+0

Tôi e rằng tôi cần một số thông tin khác để hiểu điều này, bạn có thể xây dựng những gì bạn đang làm trên mẫu, và với top_hits? Và những tác động nào có giá trị được lựa chọn (200 & 10)? –

+0

Có, có 200 và 10 trong ví dụ này có thể hơi lạ. Sampler chỉ lọc theo 200 lần truy cập hàng đầu trên mỗi phân đoạn (với giới hạn thêm rằng chúng tôi chỉ xem xét tài liệu có điểm tốt nhất cho mỗi user.id duy nhất). Trong số 200 mẫu tài liệu này, chúng tôi trả về 10 tài liệu hàng đầu sử dụng top_hits. Trong trường hợp sử dụng của bạn, những con số này có lẽ nên được thay đổi để có cùng giá trị. Các trường hợp sử dụng khác có thể yêu cầu các mẫu lớn và sau đó có kết quả nhỏ hơn, ví dụ: 200 mẫu và top 10 đáng kể_terms. – MarkH

+0

Nếu tôi không hiểu xấu. Giải pháp này ngụ ý rằng bạn chỉ có thể thấy một lần mỗi người dùng, đúng không? Vì vậy, trong trường hợp chỉ có 10 kết quả đáng kể tất cả từ cùng một người dùng, giải pháp này sẽ không bao giờ hiển thị 9 kết quả khác. Tôi đang thiếu một cái gì đó? –

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