用例:我想删除所有没有特定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。 我怎样才能删除内部列表文件?
答案 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
}
]
}
}
]
}
}