Поисковый запрос Vespa (по массиву) дает попадания даже после удаления элемента из массива. - PullRequest
0 голосов
/ 25 января 2019

Я запрашиваю vespa, чтобы проверить, присутствует ли конкретный идентификатор пользователя в массиве идентификаторов пользователей.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"
    }
}]}

InВ приведенном выше ответе нет « 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)

Скажите, пожалуйста, почему не работает опция remove .Мне действительно нужно улучшить производительность запроса, используя его.

Edit-2: следующий синтаксис, в котором упоминается элемент, который нужно удалить для обновления массива, работает правильно.Благодаря комментарию @ Jo.

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

Обратите внимание, что приведенный выше синтаксис удаляет все вхождения указанного элемента.

1 Ответ

0 голосов
/ 29 января 2019

(Резюме обсуждения выше, чтобы дать ответ для записи)

Удаление элементов массива по индексу не поддерживается, вместо этого используйте команду remove by value:

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