Поисковый запрос 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"]
          }
  }
}
Другие вопросы по тегам