Vespa搜索查询(在数组上)即使在从数组中删除元素后也能提供匹配

时间:2019-01-25 08:29:50

标签: arrays yql vespa

我正在查询vespa,以检查特定的userId是否存在于userId数组中。 http://localhost:8080/search/?yql=select * from sources doc where userIds contains 'user1';

搜索定义:

search doc {
    document doc {
        field userIds type array<string> {
            indexing : index | summary
        }
        field doctype type string {
            indexing : summary
        }
}

示例响应:

{
"children": [{
        "id": "id:doc:doc::0",
        "fields": {
            "userIds": ["user1", "user2", "user3"],
            "doctype": "type1"
        }
    },
    {
        "id": "id:doc:doc::1",
        "fields": {
            "userIds": ["user1", "user3"],
            "doctype": "type2"
        }
    }
]}

当我从数组中删除元素(“ user1 ”)时,即使从数组中成功删除,我仍然会得到响应

更新API:

PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
    "userIds[0]": {
        "remove": 0
    }
}
}

GET http://localhost:8080/document/v1/doc/doc/docid/0
{"fields": {
        "userIds": ["user2", "user3"],
        "doctype": "type1"
    }
}

即使上述userIds字段更新后,相同的查询

http://localhost:8080/search/?yql=select * from sources doc where userIds contains 'user1';

给出回应,

{"children": [{
    "id": "id:doc:doc::0",
    "fields": {
        "userIds": ["user2", "user3"],
        "doctype": "type1"
    }
},
{
    "id": "id:doc:doc::1",
    "fields": {
        "userIds": ["user1", "user3"],
        "doctype": "type2"
    }
}]}

在上述响应中,“ id:doc:doc :: 0 ”的userIds数组中没有“ user1 ”。但是,查询仍然很受欢迎。 请帮忙。

编辑-1:请注意,当我分配一个删除了元素的新数组时,它可以正常工作

PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
    "userIds": {
        "assign": ["user2", "user3"]
    }
}
}

上面的Update API为查询提供了预期的匹配结果。但是,当我从搜索器中调用Update API时,我得到了巨大的响应时间。 (要创建新的Array Object并将其分配给userIds字段,因为数组会增长到大约50000的大尺寸)

请告诉我删除选项失败的原因。我真的需要通过使用它来提高查询性能。

Edit-2:以下语法,提到要为更新数组而删除的元素,可以正常工作。感谢@Jo的评论。

PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
    "userIds": {
        "remove": ["user1"]
      }
}
}

请注意,以上语法将删除所有出现的指定元素。

1 个答案:

答案 0 :(得分:1)

(上面的讨论摘要为记录提供了答案)

不支持按索引删除数组元素,请改为按值删除:

{
"update": "id:doc:doc::0",
    "fields": {
        "userIds": {
            "remove": ["user1"]
          }
  }
}