Trước hết, hãy giới thiệu một chút về chức năng này giống như thế nào và cách hoạt động của tính năng này. Ý tưởng là bạn có một tài liệu cụ thể và bạn muốn có một số tài liệu khác tương tự như nó.
Để đạt được điều này, chúng tôi cần trích xuất một số nội dung ra khỏi tài liệu hiện tại và sử dụng nó để thực hiện truy vấn để có được những nội dung tương tự. Chúng ta có thể trích xuất nội dung từ các trường được lưu trữ lucene (hoặc trường elasticsearch _source, một trường được lưu trữ một cách hiệu quả) và bằng cách nào đó phân tích lại hoặc sử dụng thông tin được lưu trữ trong các vectơ hạn (nếu được kích hoạt trong khi lập chỉ mục) để nhận danh sách các thuật ngữ mà chúng tôi có thể sử dụng để truy vấn, mà không phải phân tích lại văn bản. Tôi không chắc liệu elasticsearch có cố gắng tiếp cận thứ hai này nếu các vectơ hạn có sẵn hay không.
more like this query cho phép bạn cung cấp văn bản, bất kể bạn lấy từ đâu. Văn bản đó sẽ được sử dụng để truy vấn các trường mà bạn chọn và lấy lại các tài liệu tương tự. Văn bản sẽ không được sử dụng hoàn toàn, nhưng được phân tích lại và chỉ tối đa max_query_terms
(mặc định 25) sẽ được giữ lại, ngoài các điều khoản có ít nhất là min_term_freq
(tần suất tối thiểu, mặc định 2) và tần suất tài liệu giữa min_doc_freq
và max_doc_freq
. Có nhiều tham số hơn có thể ảnh hưởng đến truy vấn được tạo.
more like this api tiến thêm một bước nữa, cho phép cung cấp id của tài liệu và, một lần nữa, danh sách trường. Nội dung của các trường đó sẽ được trích xuất từ tài liệu cụ thể đó và được sử dụng để thực hiện giống như truy vấn này trên cùng các trường. Điều đó có nghĩa rằng tạo ra giống như truy vấn này sẽ có văn bản thuộc tính có chứa văn bản được trích xuất trước đó và sẽ được thực hiện trên cùng các trường. Như bạn có thể thấy api giống như api này thực hiện một truy vấn giống như vậy dưới mui xe.
Giả sử càng giống truy vấn này mang lại cho bạn sự linh hoạt hơn, vì bạn có thể kết hợp nó với các truy vấn khác và bạn có thể lấy văn bản từ bất kỳ nguồn nào bạn thích. Mặt khác, api giống như api này cho thấy chức năng phổ biến làm một số công việc khác cho bạn nhưng với một số hạn chế.
Trong trường hợp của bạn, tôi sẽ kết hợp một vài khác nhau giống như các truy vấn này với nhau, để bạn có thể sử dụng DSL truy vấn elasticsearch mạnh mẽ, tăng truy vấn khác nhau, v.v. Nhược điểm là bạn phải tự cung cấp văn bản, vì bạn không thể cung cấp id của tài liệu để trích xuất nó.
Có nhiều cách khác nhau để đạt được những gì bạn muốn.Tôi sẽ sử dụng một số bool query để kết hợp hai truy vấn giống như truy vấn này trong mệnh đề nên và cung cấp cho chúng một trọng số khác nhau. Tôi cũng sẽ sử dụng số more like this field query thay vì vì bạn muốn truy vấn một trường duy nhất tại một thời điểm.
{
"bool" : {
"must" : {
{"match_all" : { }}
},
"should" : [
{
"more_like_this_field" : {
"tags" : {
"like_text" : "here go the tags extracted from the current document!",
"boost" : 2.0
}
}
},
{
"more_like_this_field" : {
"content" : {
"like_text" : "here goes the content extracted from the current document!"
}
}
}
],
"minimum_number_should_match" : 1
}
}
Cách này ít nhất một trong các mệnh đề phải phù hợp và so khớp trên thẻ quan trọng hơn so khớp với nội dung.
Cảm ơn cho câu trả lời. Vì vậy, thay thế duy nhất cho tên "' id "' không tồn tại là lấy toàn bộ văn bản và đặt nó trong "" like_text "'. Không có cách nào để tránh chuyến đi khứ hồi của toàn văn. Cũng không có cách nào để giảm nó. Ví dụ. không có cách nào để truy cập vectơ thuật ngữ của một tài liệu và chỉ nhận được 25 "thuật ngữ hàng đầu", để tôi có thể đặt chúng trực tiếp trong '" like_text "' và nhận được kết quả tương tự mà tôi nhận được với toàn văn. Vui lòng xác nhận. Tôi đã suy nghĩ về cách viết một plugin elasticsearch mà sẽ cho tôi n điều khoản hàng đầu cho một tài liệu. Bạn có nghĩ nó sẽ hiệu quả không? –
Theo như tôi biết, không có cách nào để đạt được những gì bạn muốn. Bạn có thể có thể viết một plugin cho thấy loại mới giống như truy vấn này chấp nhận id của tài liệu là đầu vào và lấy văn bản từ đó, thậm chí có thể sử dụng vectơ cụm từ khi có sẵn. – javanna