У меня есть служба, которая рекомендует документы (файлы), относящиеся к текущему контексту пользователя. Он использует ElasticSearch more_like_this в сочетании с фильтрами (см. запрос ниже). Эти документы загружаются пользователями, и если они общедоступны, то их можно рекомендовать другим пользователям. Это работает нормально, но проблема возникает, когда два или более пользователей загружают одни и те же файлы. В elasticsearch есть два или более экземпляров одного и того же документа, и весьма вероятно, что будут рекомендованы оба (или даже больше) файла.
Кто-нибудь знает, как заставить ElasticSearch игнорировать эти дубликаты и возвращать только один экземпляр одного и того же файла?
POST _search
{
"query": {
"filtered": {
"query": {
"mlt": {
"fields": [
"file"
],
"like_text": "Some sample text here",
"min_term_freq": 1,
"max_query_terms": 1,
"min_doc_freq": 1
}
},
"filter" : {
"or" : {
"filters" : [ {
"term" : {
"visibility" : "public"
}
}, {
"and" : {
"filters" : [ {
"term" : {
"visibility" : "private"
}
}, {
"term" : {
"ownerId" : 2
}
} ]
}
} ]
}
}
}
},
"fields": [
"id","title","visibility", "ownerId","contentType", "dateCreated", "url"]
}
Отредактировано:
Я решил первую часть этой проблемы. Я использую Tika для извлечения содержимого с веб-страницы или текстового документа. Затем я использую его в запросе More Like This как похожий текст, чтобы найти наиболее похожие документы, а те, у которых значения выше 0,9, помечаются как дубликаты. Для этого я использую новое поле «уникальность», которое имеет значение UUID. Если новый документ для индексации дублируется, я копирую его значение «уникальность», а если дубликатов нет, я создаю новое значение «уникальность» для этого документа.
Однако вторая часть проблемы, которую я так и не решил, заключается в том, как сделать запрос, который устранит эти дубликаты. Итак, в основном в вышеупомянутом запросе я должен интегрировать часть, которая будет выбирать только 1 экземпляр документов с одинаковым значением поля «уникальность».
Кто-нибудь знает, как это решить?