如何在Elasticsearch中始终推荐不同的文档(文件)

时间:2014-01-13 00:16:21

标签: lucene elasticsearch morelikethis

我有一项服务,建议与用户当前上下文相关的文档(文件)。它将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从网页或文本文档中提取内容。然后,我在更喜欢这个查询中使用它作为类似文本来查找大多数类似文档,而那些值高于0.9的文档被标记为重复。为此,我正在使用具有UUID值的新字段“uniqueness”。如果索引的新文档是重复的,我正在复制其“唯一性”值,如果没有重复,我正在为该文档创建新值“唯一性”。

然而,我仍然没有解决的问题的第二部分是如何进行消除这些重复的查询。所以基本上在上面提到的查询中,我必须集成部分,它将只选择1个具有相同字段“唯一性”值的文档实例。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以定义“重复”字段,您可以在索引期间将值设置为“true”或重复文档的ID。然后你可以过滤掉这些文件。