A method of processing video fingerprint data in a cloud infrastructure, the method comprising: analysing video data; extracting features from video data to form video fingerprint data, the video fingerprint data taking the form of multidimensional vectors; computing meta data and data points from the multidimensional vectors; inputting the multidimensional vector video fingerprint data into a distributed index having multiple levels, the distributed index comprising a directing tree and leaf nodes; storing the meta data relating to the multidimensional vectors in the directing tree; storing the data points computed from the multidimensional vectors in the leaf nodes; distributing the leaf nodes across one or more client system; maintaining a priority queue of nodes; determining a query data point; searching for a nearest neighbour of the query data point in multiple leaf nodes by: inserting a root node of the directing tree into the priority queue and then repeating the following steps: determining a closest distance node from the priority queue to a query node; if the closest distance node is a leaf node then add it to a list of preferred leaf nodes; if the closest distance node is not a leaf node then calculate the distance from the query point to its child nodes and insert them into the priority queue; and terminate if a maximum number of leaf nodes is reached or the priority queue is empty, wherein: the directing tree contains no data points per se but contains meta data computed from different dimensions of data points; and the leaf nodes contain actual data points which are apportioned to respective leaf nodes in a predetermined manner so that each leaf node contains data points that are relatively close to the other data points in that leaf node as compared to the data points in other leaf nodes. analysing video data; extracting features from video data to form video fingerprint data, the video fingerprint data taking the form of multidimensional vectors; computing meta data and data points from the multidimensional vectors; inputting the multidimensional vector video fingerprint data into a distributed index having multiple levels, the distributed index comprising a directing tree and leaf nodes; storing the meta data relating to the multidimensional vectors in the directing tree; storing the data points computed from the multidimensional vectors in the leaf nodes; distributing the leaf nodes across one or more client system; maintaining a priority queue of nodes; determining a query data point; searching for a nearest neighbour of the query data point in multiple leaf nodes by: inserting a root node of the directing tree into the priority queue and then repeating the following steps: determining a closest distance node from the priority queue to a query node; if the closest distance node is a leaf node then add it to a list of preferred leaf nodes; if the closest distance node is not a leaf node then calculate the distance from the query point to its child nodes and insert them into the priority queue; and terminate if a maximum number of leaf nodes is reached or the priority queue is empty, wherein: the directing tree contains no data points per se but contains meta data computed from different dimensions of data points; and the leaf nodes contain actual data points which are apportioned to respective leaf nodes in a predetermined manner so that each leaf node contains data points that are relatively close to the other data points in that leaf node as compared to the data points in other leaf nodes. determining a closest distance node from the priority queue to a query node; if the closest distance node is a leaf node then add it to a list of preferred leaf nodes; if the closest distance node is not a leaf node then calculate the distance from the query point to its child nodes and insert them into the priority queue; and if the closest distance node is a leaf node then add it to a list of preferred leaf nodes; if the closest distance node is not a leaf node then calculate the distance from the query point to its child nodes and insert them into the priority queue; and terminate if a maximum number of leaf nodes is reached or the priority queue is empty, wherein: the directing tree contains no data points per se but contains meta data computed from different dimensions of data points; and the leaf nodes contain actual data points which are apportioned to respective leaf nodes in a predetermined manner so that each leaf node contains data points that are relatively close to the other data points in that leaf node as compared to the data points in other leaf nodes. the directing tree contains no data points per se but contains meta data computed from different dimensions of data points; and the leaf nodes contain actual data points which are apportioned to respective leaf nodes in a predetermined manner so that each leaf node contains data points that are relatively close to the other data points in that leaf node as compared to the data points in other leaf nodes.