def search_vectors_in_files(self, table_name, file_ids, query_records, top_k, query_ranges=None): """ Query vectors in a table, in specified files :type table_name: str :param table_name: table name been queried :type file_ids: list[str] or list[int] :param file_ids: Specified files id array :type query_records: list[list[float]] :param query_records: all vectors going to be queried :type query_ranges: list[Range] :param query_ranges: Optional ranges for conditional search. If not specified, search whole table `Range can be generated by Prepare.range` :type top_k: int :param top_k: how many similar vectors will be searched :returns: Status: indicate if query is successful query_results: list[TopKQueryResult] :rtype: (Status, TopKQueryResult[QueryResult]) """ if not self.connected: raise NotConnectError('Please Connect to the server first!') # TODO query_ranges if not isinstance(query_records[0], ttypes.RowRecord): if not query_records or not query_records[:1]: raise ParamError('query_records empty!') if isinstance(query_records, list) and isinstance(query_records[0], list): query_records = Prepare.records(query_records) else: raise ParamError('query_records param incorrect!') res = TopKQueryResult() file_ids = [str(item) for item in file_ids if isinstance(item, int)] try: top_k_query_results = self._client.SearchVectorInFiles( table_name=table_name, file_id_array=file_ids, query_record_array=query_records, query_range_array=query_ranges, topk=top_k) for topk in top_k_query_results: res.append([QueryResult(id=qr.id, score=qr.score) for qr in topk.query_result_arrays]) return Status(Status.SUCCESS, message='Search vectors in files successfully!'), res except TTransport.TTransportException as e: raise NotConnectError('Please Connect to the server first') except ttypes.Exception as e: LOGGER.error(e) return Status(code=e.code, message=e.reason), res
async def func(pos, topks): ids = topks.id_array distances = topks.distance_array count = len(ids) // 8 assert count == len(distances) // 8 ids = struct.unpack(str(count) + 'l', ids) distances = struct.unpack(str(count) + 'd', distances) qr = [QueryResult(ids[i], distances[i]) for i in range(count)] res[pos] = qr
def search_vectors(self, table_name, top_k, query_records, query_ranges=None): """ Query vectors in a table :param query_ranges: (Optional) ranges for conditional search. If not specified, search whole table :type query_ranges: list[Range] `Range can be generated by Prepare.range` :param table_name: table name been queried :type table_name: str :param query_records: all vectors going to be queried `Please use Prepare.records generate records` :type query_records: list[RowRecord] :param top_k: int, how many similar vectors will be searched :type top_k: int :returns: (Status, res) Status: indicate if query is successful res: TopKQueryResult, return when operation is successful :rtype: (Status, TopKQueryResult[QueryResult]) """ if not self.connected: raise NotConnectError('Please Connect to the server first!') res = TopKQueryResult() try: top_k_query_results = self._client.SearchVector( table_name=table_name, query_record_array=query_records, query_range_array=query_ranges, topk=top_k) for topk in top_k_query_results: res.append([QueryResult(id=qr.id, score=qr.score) for qr in topk.query_result_arrays]) return Status(Status.SUCCESS, message='Search Vectors successfully!'), res except TTransport.TTransportException as e: LOGGER.error(e) raise NotConnectError('Please Connect to the server first') except ttypes.Exception as e: LOGGER.error(e) return Status(code=e.code, message=e.reason), res
def search_vectors(self, table_name, top_k, query_records, query_ranges=None): """ Query vectors in a table :param query_ranges: (Optional) ranges for conditional search. If not specified, search whole table :type query_ranges: list[(str, str)] `date` supports date-like-str, e.g. '2019-01-01' example query_ranges: `query_ranges = [('2019-05-10', '2019-05-10'),(..., ...), ...]` :param table_name: table name been queried :type table_name: str :param query_records: all vectors going to be queried `Using Prepare.records generate query_records` :type query_records: list[list[float]] or list[RowRecord] :param top_k: int, how many similar vectors will be searched :type top_k: int :returns: (Status, res) Status: indicate if query is successful res: TopKQueryResult, return when operation is successful :rtype: (Status, TopKQueryResult[QueryResult]) """ if not self.connected: raise NotConnectError('Please Connect to the server first!') if not isinstance(query_records[0], ttypes.RowRecord): if not query_records or not query_records[:1]: raise ParamError('query_records empty!') if isinstance(query_records, list) and isinstance( query_records[0], list): query_records = Prepare.records(query_records) else: raise ParamError('query_records param incorrect!') if not isinstance(top_k, int) or top_k <= 0 or top_k > 10000: raise ParamError( 'Param top_k should be integer between (0, 10000]!') if query_ranges: query_ranges = Prepare.ranges(query_ranges) res = TopKQueryResult() try: top_k_query_results = self._client.SearchVector( table_name=table_name, query_record_array=query_records, query_range_array=query_ranges, topk=top_k) for topk in top_k_query_results: res.append([ QueryResult(id=qr.id, score=qr.score) for qr in topk.query_result_arrays ]) return Status(Status.SUCCESS, message='Search Vectors successfully!'), res except TTransport.TTransportException as e: LOGGER.error(e) raise NotConnectError('Please Connect to the server first') except ttypes.Exception as e: LOGGER.error(e) return Status(code=e.code, message=e.reason), res
def search_vectors(self, table_name, top_k, query_records, query_ranges=None): """ Query vectors in a table :param query_ranges: (Optional) ranges for conditional search. If not specified, search whole table :type query_ranges: list[tuple(date, date)] `example query_ranges: date_begin1 = datetime.date(2019,1,1), date_end1 = datetime.date(2019,1,1) date_begin2 = datetime.datetime.now() date_end2 = datetime.datetime.now() query_ranges = [(date_begin1, date_end1), (date_begin2, date_end2)]` :param table_name: table name been queried :type table_name: str :param query_records: all vectors going to be queried `Using Prepare.records generate query_records` :type query_records: list[list[float]] or list[RowRecord] :param top_k: int, how many similar vectors will be searched :type top_k: int :returns: (Status, res) Status: indicate if query is successful res: TopKQueryResult, return when operation is successful :rtype: (Status, TopKQueryResult[QueryResult]) """ if not self.connected: raise NotConnectError('Please Connect to the server first!') if not isinstance(query_records[0], ttypes.RowRecord): if not query_records or not query_records[:1]: raise ParamError('query_records empty!') if isinstance(query_records, list) and isinstance(query_records[0], list): query_records = Prepare.records(query_records) else: raise ParamError('query_records param incorrect!') if query_ranges: # TODO type check query_ranges = Prepare.ranges(query_ranges) res = TopKQueryResult() try: top_k_query_results = self._client.SearchVector( table_name=table_name, query_record_array=query_records, query_range_array=query_ranges, topk=top_k) for topk in top_k_query_results: res.append([QueryResult(id=qr.id, score=qr.score) for qr in topk.query_result_arrays]) return Status(Status.SUCCESS, message='Search Vectors successfully!'), res except TTransport.TTransportException as e: LOGGER.error(e) raise NotConnectError('Please Connect to the server first') except ttypes.Exception as e: LOGGER.error(e) return Status(code=e.code, message=e.reason), res