在bool查询中Must_not?

时间:2017-06-25 18:36:29

标签: elasticsearch

用例:我想删除所有没有特定ID的文档。

映射:

"bookList": {
                  "properties": {
                     "bookname": {
                        "type": "string"
                     },
                     "bookId": {
                        "type": "long"
                     },
}

每个文档中的内容都是这样的:有些内容列表是DOC1

"bookList": [
                  {
                     "bookname": "HITLER",
                     "bookId": 3163
                   },
                   {
                       "bookname": "MARTIAN", 
                       "bookId": 1210
                   }
                   ]

只有一个这样的列表让它成为DOC2

"bookList": [
                  {
                     "bookname": "WASHINGTON",
                     "bookId": 3163
                   }
                   ]

另一份文件DOC3:

 "bookList": [
                      {
                         "bookname": "SHELDON",
                         "bookId": 3163
                       },
                       {
                           "bookname": "MARVELS", 
                           "bookId": 1219
                       }
                       ]

我在ES 2.4.0中使用delete_by_query插件在bool查询中使用MUST_NOT删除没有bookId : 3163的文档。对于内部列表文档(即DOC1和DOC3),它不会删除它们,因为如果该术语存在于任一内部列表中,则MUST_NOT会找到确切的术语,然后它不会删除该文档。

我的查询是这样的:

{
    "query" : {
    "bool" : {
        "must_not" : {
            "term" : {
        "bookList.bookId" :3163 
            }
    }
    }
}
}

此查询仅删除DOC2但不删除DOC1。 我怎样才能删除内部列表文件?

1 个答案:

答案 0 :(得分:0)

我认为你应该使用过滤器上下文。

  

在过滤器上下文中,查询子句回答问题“这是否   文档匹配此查询子句?“答案是简单的是或   否 - 没有计算得分。 (来自:documentation

请参阅Elastic上的文档。

PUT _template/stackoverflow
{
  "template": "stackoverflow",
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "bookList": {
      "properties": {
        "bookname": {
          "type": "text"
        },
        "bookId": {
          "type": "long"
        }
      }
    }
  }
}


POST stackoverflow/bookList/1
{
  "bookList": [
    {
      "bookname": "HITLER",
      "bookId": 3163
    },
    {
      "bookname": "MARTIAN",
      "bookId": 1210
    }
  ]
}

POST stackoverflow/bookList/2
{
  "bookList": [
    {
      "bookname": "WASHINGTON",
      "bookId": 3163
    }
  ]
}

POST stackoverflow/bookList/3
{
  "bookList": [
    {
      "bookname": "SHELDON",
      "bookId": 3163
    },
    {
      "bookname": "MARVELS",
      "bookId": 1219
    }
  ]
}

POST stackoverflow/bookList/4
{
  "bookList": [
    {
      "bookname": "SHELDON",
      "bookId": 3164
    },
    {
      "bookname": "MARVELS",
      "bookId": 1220
    }
  ]
}

执行:

GET stackoverflow/bookList/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "bookList.bookId": 3163
            }
          }
        }
      }
    }
  }
}

结果:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "stackoverflow",
        "_type": "bookList",
        "_id": "4",
        "_score": 1,
        "_source": {
          "bookList": [
            {
              "bookname": "SHELDON",
              "bookId": 3164
            },
            {
              "bookname": "MARVELS",
              "bookId": 1220
            }
          ]
        }
      }
    ]
  }
}

执行:

GET stackoverflow/_search
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "bookList.bookId": 3163
        }
      }
    }
  }
}

结果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "stackoverflow",
        "_type": "bookList",
        "_id": "1",
        "_score": 1,
        "_source": {
          "bookList": [
            {
              "bookname": "HITLER",
              "bookId": 3163
            },
            {
              "bookname": "MARTIAN",
              "bookId": 1210
            }
          ]
        }
      },
      {
        "_index": "stackoverflow",
        "_type": "bookList",
        "_id": "2",
        "_score": 1,
        "_source": {
          "bookList": [
            {
              "bookname": "WASHINGTON",
              "bookId": 3163
            }
          ]
        }
      },
      {
        "_index": "stackoverflow",
        "_type": "bookList",
        "_id": "3",
        "_score": 1,
        "_source": {
          "bookList": [
            {
              "bookname": "SHELDON",
              "bookId": 3163
            },
            {
              "bookname": "MARVELS",
              "bookId": 1219
            }
          ]
        }
      }
    ]
  }
}