fromllama_index.vector_stores.timescalevectorimportTimescaleVectorStore# Set up the Timescale service URLTIMESCALE_SERVICE_URL="postgres://tsdbadmin:<password>@<id>.tsdb.cloud.timescale.com:<port>/tsdb?sslmode=require"# Create a TimescaleVectorStore instancevector_store=TimescaleVectorStore.from_params(service_url=TIMESCALE_SERVICE_URL,table_name="your_table_name_here",num_dimensions=1536,)
Source code in llama-index-integrations/vector_stores/llama-index-vector-stores-timescalevector/llama_index/vector_stores/timescalevector/base.py
classTimescaleVectorStore(VectorStore):"""Timescale vector store. Examples: `pip install llama-index-vector-stores-timescalevector` ```python from llama_index.vector_stores.timescalevector import TimescaleVectorStore # Set up the Timescale service URL TIMESCALE_SERVICE_URL = "postgres://tsdbadmin:<password>@<id>.tsdb.cloud.timescale.com:<port>/tsdb?sslmode=require" # Create a TimescaleVectorStore instance vector_store = TimescaleVectorStore.from_params( service_url=TIMESCALE_SERVICE_URL, table_name="your_table_name_here", num_dimensions=1536, ) ``` """stores_text=Trueflat_metadata=Falsedef__init__(self,service_url:str,table_name:str,num_dimensions:int=DEFAULT_EMBEDDING_DIM,time_partition_interval:Optional[timedelta]=None,)->None:self.service_url=service_urlself.table_name:str=table_name.lower()self.num_dimensions=num_dimensionsself.time_partition_interval=time_partition_intervalself._create_clients()self._create_tables()asyncdefclose(self)->None:self._sync_client.close()awaitself._async_client.close()@classmethoddeffrom_params(cls,service_url:str,table_name:str,num_dimensions:int=DEFAULT_EMBEDDING_DIM,time_partition_interval:Optional[timedelta]=None,)->"TimescaleVectorStore":returncls(service_url=service_url,table_name=table_name,num_dimensions=num_dimensions,time_partition_interval=time_partition_interval,)def_create_clients(self)->None:# in the normal case doesn't restrict the id type to even uuid.# Allow arbitrary textid_type="TEXT"ifself.time_partition_intervalisnotNone:# for time partitioned tables, the id type must be UUID v1id_type="UUID"self._sync_client=client.Sync(self.service_url,self.table_name,self.num_dimensions,id_type=id_type,time_partition_interval=self.time_partition_interval,)self._async_client=client.Async(self.service_url,self.table_name,self.num_dimensions,id_type=id_type,time_partition_interval=self.time_partition_interval,)def_create_tables(self)->None:self._sync_client.create_tables()def_node_to_row(self,node:BaseNode)->Any:metadata=node_to_metadata_dict(node,remove_text=True,flat_metadata=self.flat_metadata,)# reuse the node id in the common caseid=node.node_idifself.time_partition_intervalisnotNone:# for time partitioned tables, the id must be a UUID v1,# so generate one if it's not already settry:# Attempt to parse the UUID from the stringparsed_uuid=uuid.UUID(id)ifparsed_uuid.version!=1:id=str(uuid.uuid1())exceptValueError:id=str(uuid.uuid1())return[id,metadata,node.get_content(metadata_mode=MetadataMode.NONE),node.embedding,]defadd(self,nodes:List[BaseNode],**add_kwargs:Any)->List[str]:rows_to_insert=[self._node_to_row(node)fornodeinnodes]ids=[result[0]forresultinrows_to_insert]self._sync_client.upsert(rows_to_insert)returnidsasyncdefasync_add(self,nodes:List[BaseNode],**add_kwargs:Any)->List[str]:rows_to_insert=[self._node_to_row(node)fornodeinnodes]ids=[result.node_idforresultinnodes]awaitself._async_client.upsert(rows_to_insert)returnidsdef_filter_to_dict(self,metadata_filters:Optional[MetadataFilters])->Optional[Dict[str,str]]:ifmetadata_filtersisNoneorlen(metadata_filters.legacy_filters())<=0:returnNoneres={}forfilterinmetadata_filters.legacy_filters():res[filter.key]=filter.valuereturnresdef_db_rows_to_query_result(self,rows:List)->VectorStoreQueryResult:nodes=[]similarities=[]ids=[]forrowinrows:try:node=metadata_dict_to_node(row[client.SEARCH_RESULT_METADATA_IDX])node.set_content(str(row[client.SEARCH_RESULT_CONTENTS_IDX]))exceptException:# NOTE: deprecated legacy logic for backward compatibilitynode=TextNode(id_=row[client.SEARCH_RESULT_ID_IDX],text=row[client.SEARCH_RESULT_CONTENTS_IDX],metadata=row[client.SEARCH_RESULT_METADATA_IDX],)similarities.append(row[client.SEARCH_RESULT_DISTANCE_IDX])ids.append(row[client.SEARCH_RESULT_ID_IDX])nodes.append(node)returnVectorStoreQueryResult(nodes=nodes,similarities=similarities,ids=ids,)defdate_to_range_filter(self,**kwargs:Any)->Any:constructor_args={key:kwargs[key]forkeyin["start_date","end_date","time_delta","start_inclusive","end_inclusive",]ifkeyinkwargs}ifnotconstructor_argsorlen(constructor_args)==0:returnNonereturnclient.UUIDTimeRange(**constructor_args)def_query_with_score(self,embedding:Optional[List[float]],limit:int=10,metadata_filters:Optional[MetadataFilters]=None,**kwargs:Any,)->VectorStoreQueryResult:filter=self._filter_to_dict(metadata_filters)res=self._sync_client.search(embedding,limit,filter,uuid_time_filter=self.date_to_range_filter(**kwargs),)returnself._db_rows_to_query_result(res)asyncdef_aquery_with_score(self,embedding:Optional[List[float]],limit:int=10,metadata_filters:Optional[MetadataFilters]=None,**kwargs:Any,)->VectorStoreQueryResult:filter=self._filter_to_dict(metadata_filters)res=awaitself._async_client.search(embedding,limit,filter,uuid_time_filter=self.date_to_range_filter(**kwargs),)returnself._db_rows_to_query_result(res)defquery(self,query:VectorStoreQuery,**kwargs:Any)->VectorStoreQueryResult:returnself._query_with_score(query.query_embedding,query.similarity_top_k,query.filters,**kwargs)asyncdefaquery(self,query:VectorStoreQuery,**kwargs:Any)->VectorStoreQueryResult:returnawaitself._aquery_with_score(query.query_embedding,query.similarity_top_k,query.filters,**kwargs,)defdelete(self,ref_doc_id:str,**delete_kwargs:Any)->None:filter:Dict[str,str]={"doc_id":ref_doc_id}self._sync_client.delete_by_metadata(filter)DEFAULT_INDEX_TYPE=IndexType.TIMESCALE_VECTORdefcreate_index(self,index_type:IndexType=DEFAULT_INDEX_TYPE,**kwargs:Any)->None:ifindex_type==IndexType.PGVECTOR_IVFFLAT:self._sync_client.create_embedding_index(client.IvfflatIndex(**kwargs))ifindex_type==IndexType.PGVECTOR_HNSW:self._sync_client.create_embedding_index(client.HNSWIndex(**kwargs))ifindex_type==IndexType.TIMESCALE_VECTOR:self._sync_client.create_embedding_index(client.TimescaleVectorIndex(**kwargs))defdrop_index(self)->None:self._sync_client.drop_embedding_index()