1

我有一项服务可以推荐与用户当前上下文相关的文档(文件)。它结合使用 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 值的新字段“唯一性”。如果要索引的新文档是重复的,我将复制其“唯一性”值,如果没有重复,我将为该文档创建新值“唯一性”。

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

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

4

1 回答 1

2

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

于 2014-01-13T10:51:18.400 回答