Как всегда рекомендовать разные документы (файлы) в Elasticsearch

У меня есть служба, которая рекомендует документы (файлы), относящиеся к текущему контексту пользователя. Он использует 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 экземпляр документов с одинаковым значением поля «уникальность».

Кто-нибудь знает, как это решить?


person zoran jeremic    schedule 13.01.2014    source источник


Ответы (1)


Вы можете определить поле «дубликат», в котором вы можете установить значение «истина» или идентификатор дубликата документа во время индексации. то вы можете отфильтровать эти документы.

person fatih    schedule 13.01.2014
comment
Да. Это возможное решение, хотя я надеялся найти какое-то решение, в котором я мог бы искать в elasticsearch отдельные файлы. Если то, что вы предложили, применяется, как лучше всего найти дубликаты файлов? Использовать More Like This и выбрать те результаты, оценка которых близка к 1,0? - person zoran jeremic; 14.01.2014
comment
Это был бы вариант. Но если ваш контент точно такой же, я бы рекомендовал использовать хэш (например, MD5), чтобы найти дубликат. - person fatih; 14.01.2014
comment
Это была моя первая идея, но я был обеспокоен тем, что это не даст мне желаемых результатов, если, например, два пользователя загрузят одну и ту же книгу в формате PDF, созданную на разных принтерах в формате PDF, поэтому, например, в одной из книг отсутствует 1 буква. MD5 для этих файлов не будет одинаковым, поэтому я снова порекомендую два экземпляра одной и той же книги. - person zoran jeremic; 14.01.2014
comment
Вот почему я сказал: если содержание точно такое же. В вашем случае MoreLikeThis будет правильным направлением. - person fatih; 14.01.2014
comment
вы смогли найти решение? Я все еще думаю, что мой ответ соответствует вашему вопросу. вам нужно дублирующее поле - person fatih; 17.07.2014
comment
Спасибо за ваше предложение. Я мог бы применить его, но только до некоторой степени. Я не смог найти решение для фильтрации дубликатов документов. Что я сделал, так это добавил уникальность поля в каждый документ. Прежде чем индексировать документ, я проверяю, есть ли похожие документы, и если я нахожу документ с порогом, новый документ получает тот же номер уникальности, что означает, что эти документы являются почти копиями. Однако я не нашел решения всегда выбирать только документы с наивысшим баллом из тех, которые имеют одинаковое значение уникальности. Мне пришлось сделать это в java, что является грязным решением и неэффективно. - person zoran jeremic; 18.07.2014
comment
Я не мог применить значение true/false для дубликата, потому что это может исключить документ, который может быть оценен лучше, чем тот, который был вставлен ранее, поэтому я попытался использовать все документы и выбрать только лучший. - person zoran jeremic; 18.07.2014
comment
уникальные и разные оценки, которые на самом деле невозможно обработать с помощью запроса. мой подход также будет заключаться в том, чтобы делать это снаружи, как вы, или, если вы знаете lucene, делать это с помощью специального экземпляра сборщика. - person fatih; 18.07.2014