我正在查询 vespa 以检查特定的 userId 是否存在于 userIds 数组中。
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 ”。但是,查询仍然给它一个打击。请帮忙。
Edit-1:请注意,当我分配一个删除元素的新数组时,它可以正常工作
PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
"userIds": {
"assign": ["user2", "user3"]
}
}
}
上述更新 API 为查询提供了预期的命中响应。但是,当我从 Searcher 中调用更新 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"]
}
}
}
请注意,上述语法会删除所有出现的指定元素。