• 删除文档

删除文档仅在 RT 模式 下支持以下表类型:

你可以根据文档的 ID 或某些条件从表中删除现有文档。

此外,批量删除 可用于删除多个文档。

删除文档可以通过 SQL 和 JSON 接口完成。

对于 SQL,成功操作的响应将指示删除的行数。

对于 JSON,使用 json/delete 端点。服务器将响应一个 JSON 对象,指示操作是否成功以及删除的行数。

建议使用 表截断 来删除表中的所有文档,因为这是一个更快的操作。

在此示例中,我们将从名为 test 的表中删除所有符合全文查询 test document 的文档:

SQL:

mysql> SELECT * FROM TEST;
+------+------+-------------+------+
| id   | gid  | mva1        | mva2 |
+------+------+-------------+------+
|  100 | 1000 | 100,201     | 100  |
|  101 | 1001 | 101,202     | 101  |
|  102 | 1002 | 102,203     | 102  |
|  103 | 1003 | 103,204     | 103  |
|  104 | 1004 | 104,204,205 | 104  |
|  105 | 1005 | 105,206     | 105  |
|  106 | 1006 | 106,207     | 106  |
|  107 | 1007 | 107,208     | 107  |
+------+------+-------------+------+
8 rows in set (0.00 sec)

mysql> DELETE FROM TEST WHERE MATCH ('test document');
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM TEST;
+------+------+-------------+------+
| id   | gid  | mva1        | mva2 |
+------+------+-------------+------+
|  100 | 1000 | 100,201     | 100  |
|  101 | 1001 | 101,202     | 101  |
|  102 | 1002 | 102,203     | 102  |
|  103 | 1003 | 103,204     | 103  |
|  104 | 1004 | 104,204,205 | 104  |
|  105 | 1005 | 105,206     | 105  |
+------+------+-------------+------+
6 rows in set (0.00 sec)
POST /delete -d '
    {
        "index":"test",
        "query":
        {
            "match": { "*": "test document" }
        }
    }'
  • query 的 JSON 格式包含一个用于全文搜索的子句,语法与 JSON/update 中的相同。

{
    "_index":"test",
    "deleted":2,
}

PHP:

$index->deleteDocuments(new MatchPhrase('test document','*'));
Array(
    [_index] => test
    [deleted] => 2
)

Python:

indexApi.delete({"index" : "test", "query": { "match": { "*": "test document" }}})
{'deleted': 5, 'id': None, 'index': 'test', 'result': None}

Javascript:

res = await indexApi.delete({"index" : "test", "query": { "match": { "*": "test document" }}});
{"_index":"test","deleted":5}

java:

DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest();
query = new HashMap<String,Object>();
query.put("match",new HashMap<String,Object>(){{
    put("*","test document");
}});
deleteRequest.index("test").setQuery(query);
indexApi.delete(deleteRequest);
class DeleteResponse {
    index: test
    deleted: 5
    id: null
    result: null
}

C#:

Dictionary<string, Object> match = new Dictionary<string, Object>();
match.Add("*", "test document");
Dictionary<string, Object> query = new Dictionary<string, Object>();
query.Add("match", match);
DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest(index: "test", query: query);
indexApi.Delete(deleteRequest);
class DeleteResponse {
    index: test
    deleted: 5
    id: null
    result: null
}

TypeScript:

res = await indexApi.delete({
  index: 'test',
  query: { match: { '*': 'test document' } },
});
{"_index":"test","deleted":5}

Go:

deleteRequest := manticoresearch.NewDeleteDocumentRequest("test")
matchExpr := map[string]interface{} {"*": "test document"}
deleteQuery := map[string]interface{} {"match": matchExpr }
deleteRequest.SetQuery(deleteQuery)
{"_index":"test","deleted":5}

以下示例展示了如何从名为 test 的表中删除 id 为 1 的文档:

SQL:

mysql> DELETE FROM TEST WHERE id=1;
Query OK, 1 rows affected (0.00 sec)
POST /delete -d '
    {
        "index": "test",
        "id": 1
    }'
  • 对于 JSON,id 表示应删除的行的 id

{
    "_index": "test",
    "_id": 1,
    "found": true,
    "result": "deleted"      
}

PHP:

$index->deleteDocument(1);
Array(
    [_index] => test
    [_id] => 1
    [found] => true
    [result] => deleted
)

Python:

indexApi.delete({"index" : "test", "id" : 1})
{'deleted': None, 'id': 1, 'index': 'test', 'result': 'deleted'}

Javascript:

res = await indexApi.delete({"index" : "test", "id" : 1});
{"_index":"test","_id":1,"result":"deleted"}

java:

DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest();
deleteRequest.index("test").setId(1L);
indexApi.delete(deleteRequest);
class DeleteResponse {
    index: test
    _id: 1
    result: deleted
}

C#:

DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest(index: "test", id: 1);
indexApi.Delete(deleteRequest);
class DeleteResponse {
    index: test
    _id: 1
    result: deleted
}

TypeScript:

res = await indexApi.delete({ index: 'test', id: 1 });
{"_index":"test","_id":1,"result":"deleted"}

Go:

deleteRequest := manticoresearch.NewDeleteDocumentRequest("test")
deleteRequest.SetId(1)
{"_index":"test","_id":1,"result":"deleted"}

以下示例展示了如何删除 id 匹配给定值的文档,删除操作发生在名为 test 的表中:

请注意,使用 id=Nid IN (X,Y) 的删除形式是最快的,因为它们在删除文档时无需执行搜索操作。 还要注意,响应中只包含第一个被删除文档的 id,并显示在相应的 _id 字段中。

SQL:

DELETE FROM TEST WHERE id IN (1,2);
Query OK, 2 rows affected (0.00 sec)
POST /delete -d '
    {
        "index":"test",
        "id": [1,2]
    }'
    {
        "_index":"test",
        "_id":1,
        "found":true,
        "result":"deleted"      
    }

PHP:

$index->deleteDocumentsByIds([1,2]);
Array(
    [_index] => test
    [_id] => 1
    [found] => true
    [result] => deleted
)

Manticore SQL 允许在 DELETE 语句中使用复杂条件。

例如,以下示例展示了如何从名为 test 的表中删除满足全文查询 test document 且属性 mva1 大于 206 或 mva1 值为 100 或 103 的文档:

SQL:

DELETE FROM TEST WHERE MATCH ('test document') AND ( mva1>206 or mva1 in (100, 103) );

SELECT * FROM TEST;
Query OK, 4 rows affected (0.00 sec)

+------+------+-------------+------+
| id   | gid  | mva1        | mva2 |
+------+------+-------------+------+
|  101 | 1001 | 101,202     | 101  |
|  102 | 1002 | 102,203     | 102  |
|  104 | 1004 | 104,204,205 | 104  |
|  105 | 1005 | 105,206     | 105  |
+------+------+-------------+------+
6 rows in set (0.00 sec)

以下是从集群 cluster 中的表 test 删除文档的示例。请注意,当从复制集群中的表中删除行时,必须同时提供集群名称和表名称属性:

SQL:

delete from cluster:test where id=100;
POST /delete -d '
    {
      "cluster": "cluster",
      "index": "test",
      "id": 100
    }'
  • cluster 用于 JSON 中,表示包含所需表的复制集群的名称。

PHP:

$index->setCluster('cluster');
$index->deleteDocument(100);
Array(
    [_index] => test
    [_id] => 100
    [found] => true
    [result] => deleted
)

Python:

indexApi.delete({"cluster":"cluster","index" : "test", "id" : 1})
{'deleted': None, 'id': 1, 'index': 'test', 'result': 'deleted'}

Javascript:

indexApi.delete({"cluster":"cluster_1","index" : "test", "id" : 1})
{"_index":"test","_id":1,"result":"deleted"}

java:

DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest();
deleteRequest.cluster("cluster").index("test").setId(1L);
indexApi.delete(deleteRequest);
class DeleteResponse {
    index: test
    _id: 1
    result: deleted
}

C#:

DeleteDocumentRequest deleteRequest = new DeleteDocumentRequest(index: "test", cluster: "cluster", id: 1);
indexApi.Delete(deleteRequest);
class DeleteResponse {
    index: test
    _id: 1
    result: deleted
}

TypeScript:

res = await indexApi.delete({ cluster: 'cluster_1', index: 'test', id: 1 });
{"_index":"test","_id":1,"result":"deleted"}

Go:

deleteRequest := manticoresearch.NewDeleteDocumentRequest("test")
deleteRequest.SetCluster("cluster_1")
deleteRequest.SetId(1)
{"_index":"test","_id":1,"result":"deleted"}

批量删除

您还可以通过 /bulk 端点在单个调用中执行多个删除操作。该端点仅适用于 Content-Type 设置为 application/x-ndjson 的数据。数据应以换行分隔的 JSON (NDJSON) 格式编写。简而言之,这意味着每一行应包含一个 JSON 语句,并以换行符 或可能的 结尾。

JSON:

POST /bulk

{ "delete" : { "index" : "test", "id" : 1 } }
{ "delete" : { "index" : "test", "query": { "equals": { "int_data" : 20 } } } }
{
   "items":
   [
      {
         "bulk":
         {
            "_index":"test",
            "_id":0,
            "created":0,
            "deleted":2,
            "updated":0,
            "result":"created",
            "status":201
         }
      }
   ],
   "errors":false
}

PHP:


$client->bulk([
    ['delete' => [
            'index' => 'test',
            'id' => 1
        ]
    ],
    ['delete'=>[
            'index' => 'test',
            'query' => [
                'equals' => ['int_data' => 20]
            ]
        ]
    ]
]);
Array(
    [items] => Array
        (
            [0] => Array
                (
                    [bulk] => Array
                        (
                            [_index] => test
                            [_id] => 0
                            [created] => 0
                            [deleted] => 2
                            [updated] => 0
                            [result] => created
                            [status] => 201
                        )

                )

        )

    [current_line] => 3
    [skipped_lines] => 0
    [errors] =>
    [error] =>
)

Python:

docs = [ \
            { "delete" : { "index" : "test", "id": 1 } }, \
            { "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } } ]
indexApi.bulk('\n'.join(map(json.dumps,docs)))
{
    'error': None,
    'items': [{u'delete': {u'_index': test', u'deleted': 2}}]
}

Javascript:

docs = [
            { "delete" : { "index" : "test", "id": 1 } },
            { "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } } ];
res =  await indexApi.bulk(docs.map(e=>JSON.stringify(e)).join('\n'));
{"items":[{"delete":{"_index":"test","deleted":2}}],"errors":false}

java:

String   body = "{ "delete" : { "index" : "test", "id": 1 } } "+"\n"+
    "{ "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } }"+"\n";         
indexApi.bulk(body);
class BulkResponse {
    items: [{delete={_index=test, _id=0, created=false, deleted=2, result=created, status=200}}]
    error: null
    additionalProperties: {errors=false}
}

C#:

string   body = "{ "delete" : { "index" : "test", "id": 1 } } "+"\n"+
    "{ "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } }"+"\n";         
indexApi.Bulk(body);
class BulkResponse {
    items: [{replace={_index=test, _id=0, created=false, deleted=2, result=created, status=200}}]
    error: null
    additionalProperties: {errors=false}
}

TypeScript:

docs = [
  { "delete" : { "index" : "test", "id": 1 } },
  { "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } }
];
body = await indexApi.bulk(
  docs.map((e) => JSON.stringify(e)).join("\n")
);            
res = await indexApi.bulk(body);
{"items":[{"delete":{"_index":"test","deleted":2}}],"errors":false}

Go:

docs = []string {
  `{ "delete" : { "index" : "test", "id": 1 } }`,
  `{ "delete" : { "index" : "test", "query": { "equals": { "int_data": 20 } } } }`
]
body = strings.Join(docs, "\n")
resp, httpRes, err := manticoreclient.IndexAPI.Bulk(context.Background()).Body(body).Execute()
{"items":[{"delete":{"_index":"test","deleted":2}}],"errors":false}

最后更新于