Поисковый запрос Vespa (по массиву) дает попадания даже после удаления элемента из массива.
Я запрашиваю 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"
}
}]}
В приведенном выше ответе нет " user1 " в массиве userIds " id: doc: doc:: 0 ". Но, тем не менее, запрос дает это как хит. Пожалуйста помоги.
Edit-1: обратите внимание, что, когда я назначаю новый массив с удаленным элементом, он работает правильно
PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
"userIds": {
"assign": ["user2", "user3"]
}
}
}
Приведенный выше API обновлений дает ожидаемые хиты в ответе на запрос. Но, поскольку я вызываю Update API из Searcher, я получаю огромную задержку во времени ответа. (Создать новый объект Array и назначить его в поле userIds, когда размер массива увеличится до 50000).
Пожалуйста, скажите мне, почему опция удаления не работает. Мне действительно нужно улучшить производительность запроса, используя его.
Edit-2: следующий синтаксис, упоминая элемент, который будет удален для обновления массива, работает правильно. Благодаря комментарию @ Джо.
PUT http://localhost:8080/document/v1/doc/doc/docid/0
{
"update": "id:doc:doc::0",
"fields": {
"userIds": {
"remove": ["user1"]
}
}
}
Обратите внимание, что приведенный выше синтаксис удаляет все вхождения указанного элемента.
1 ответ
(Резюме обсуждения выше, чтобы дать ответ для записи)
Удаление элементов массива по индексу не поддерживается, вместо этого используйте команду remove by value:
{
"update": "id:doc:doc::0",
"fields": {
"userIds": {
"remove": ["user1"]
}
}
}