找到ID不在我的黑名单中的所有ID

时间:2015-01-10 16:10:56

标签: elasticsearch

经过多次讲座后,我不能说弹性搜索是否可以进行此类查询,我发现"入门"非常优秀,但导游的其余部分缺乏例子(从我的观点来看)。

请参阅下面的结构,我需要检索所有不在我的黑名单中的ID。我的黑名单是一些参考ID。对于这个例子,我是名字1,名字是" me" 。在结构中我们看到我被列入黑名单" bob" ,所以bob id(2)在我的黑名单数组中,因为我不想在我的搜索结果中找到bob .. :))

是否可以仅在一个查询中检索(动态肯定)所有不在我的黑名单中的ID? 如果你来自SQL,那么相同的逻辑可能是:

SELECT id FROM index WHERE id NOT IN (SELECT * FROM blacklist WHERE id = 1)

我想避免两步查询,如果我的架构不好并且应该重新考虑,请我完全接受建议或建议。

这是结构:

{
    "id: 1,
    "balance": 16623,
    "firstname": "me",
    "blacklist" : [2,1982,939,1982,98716,7611,983838, and thousands others ....],

}
{
    "id: 2,
    "balance": 16623,
    "firstname": "bob,
    "blacklist" : [18,1982,939,1982,98716,7611,983838, and thousands others ....],

}
{
    "id: 3,
    "balance": 16623,
    "firstname": "jhon",
    "blacklist" : [18,1982,939,1982,98716,7611,983838, and thousands others ....],

}

1 个答案:

答案 0 :(得分:0)

您可以使用terms filter lookupnot filter,如下所示。

我使用您列出的三个文档设置索引:

DELETE /test_index

PUT /test_index

PUT /test_index/doc/1
{
    "id": 1,
    "balance": 16623,
    "firstname": "me",
    "blacklist" : [2,1982,939,1982,98716,7611,983838]
}
PUT /test_index/doc/2
{
    "id": 2,
    "balance": 16623,
    "firstname": "bob",
    "blacklist" : [18,1982,939,1982,98716,7611,983838]
}
PUT /test_index/doc/3
{
    "id": 3,
    "balance": 16623,
    "firstname": "john",
    "blacklist" : [18,1982,939,1982,98716,7611,983838]
}

然后设置一个查询,过滤掉"me"黑名单中的文档:

POST /test_index/doc/_search
{
   "filter": {
      "not": {
         "filter": {
            "terms": {
               "id": {
                  "index": "test_index",
                  "type": "doc",
                  "id": "1",
                  "path": "blacklist"
               }
            }
         }
      }
   }
}
...
{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 1,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 1,
            "_source": {
               "id": 1,
               "balance": 16623,
               "firstname": "me",
               "blacklist": [2,1982,939,1982,98716,7611,983838]
            }
         },
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "3",
            "_score": 1,
            "_source": {
               "id": 3,
               "balance": 16623,
               "firstname": "john",
               "blacklist": [18,1982,939,1982,98716,7611,983838]
            }
         }
      ]
   }
}

如果您还要过滤掉正在使用黑名单的用户,可以使用or设置稍微复杂的过滤器:

POST /test_index/doc/_search
{
   "filter": {
      "not": {
         "filter": {
            "or": {
               "filters": [
                  {
                     "terms": {
                        "id": {
                           "index": "test_index",
                           "type": "doc",
                           "id": "1",
                           "path": "blacklist"
                        }
                     }
                  },
                  {
                     "term": {
                        "id": "1"
                     }
                  }
               ]
            }
         }
      }
   }
}
...
{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "3",
            "_score": 1,
            "_source": {
               "id": 3,
               "balance": 16623,
               "firstname": "john",
               "blacklist": [18,1982,939,1982,98716,7611,983838]
            }
         }
      ]
   }
}

以下是我使用的代码:

http://sense.qbox.io/gist/0b6808414f9447d4f7d23eb4c0d3e937ec2ea4e7