[docs]def__init__(self,embedding_function:Embeddings,url:str,index_name:str,content_key:str="content",metadata_key:str="metadata",search_params:Optional[dict]=None,**kwargs:Any,):self.embedding_function=embedding_functionself.index_name=index_nametry:fromtairimportTairasTairClientexceptImportError:raiseImportError("Could not import tair python package. ""Please install it with `pip install tair`.")try:# connect to tair from urlclient=TairClient.from_url(url,**kwargs)exceptValueErrorase:raiseValueError(f"Tair failed to connect: {e}")self.client=clientself.content_key=content_keyself.metadata_key=metadata_keyself.search_params=search_params
[docs]defadd_texts(self,texts:Iterable[str],metadatas:Optional[List[dict]]=None,**kwargs:Any,)->List[str]:"""Add texts data to an existing index."""ids=[]keys=kwargs.get("keys",None)use_hybrid_search=Falseindex=self.client.tvs_get_index(self.index_name)ifindexisnotNoneandindex.get("lexical_algorithm")=="bm25":use_hybrid_search=True# Write data to tairpipeline=self.client.pipeline(transaction=False)embeddings=self.embedding_function.embed_documents(list(texts))fori,textinenumerate(texts):# Use provided key otherwise use default keykey=keys[i]ifkeyselse_uuid_key()metadata=metadatas[i]ifmetadataselse{}ifuse_hybrid_search:# tair use TEXT attr hybrid searchpipeline.tvs_hset(self.index_name,key,embeddings[i],False,**{"TEXT":text,self.content_key:text,self.metadata_key:json.dumps(metadata),},)else:pipeline.tvs_hset(self.index_name,key,embeddings[i],False,**{self.content_key:text,self.metadata_key:json.dumps(metadata),},)ids.append(key)pipeline.execute()returnids
[docs]defsimilarity_search(self,query:str,k:int=4,**kwargs:Any)->List[Document]:""" Returns the most similar indexed documents to the query text. Args: query (str): The query text for which to find similar documents. k (int): The number of documents to return. Default is 4. Returns: List[Document]: A list of documents that are most similar to the query text. """# Creates embedding vector from user queryembedding=self.embedding_function.embed_query(query)keys_and_scores=self.client.tvs_knnsearch(self.index_name,k,embedding,False,None,**kwargs)pipeline=self.client.pipeline(transaction=False)forkey,_inkeys_and_scores:pipeline.tvs_hmget(self.index_name,key,self.metadata_key,self.content_key)docs=pipeline.execute()return[Document(page_content=d[1],metadata=json.loads(d[0]),)fordindocs]
[docs]@classmethoddeffrom_texts(cls:Type[Tair],texts:List[str],embedding:Embeddings,metadatas:Optional[List[dict]]=None,index_name:str="langchain",content_key:str="content",metadata_key:str="metadata",**kwargs:Any,)->Tair:try:fromtairimporttairvectorexceptImportError:raiseImportError("Could not import tair python package. ""Please install it with `pip install tair`.")url=get_from_dict_or_env(kwargs,"tair_url","TAIR_URL")if"tair_url"inkwargs:kwargs.pop("tair_url")distance_type=tairvector.DistanceMetric.InnerProductif"distance_type"inkwargs:distance_type=kwargs.pop("distance_type")index_type=tairvector.IndexType.HNSWif"index_type"inkwargs:index_type=kwargs.pop("index_type")data_type=tairvector.DataType.Float32if"data_type"inkwargs:data_type=kwargs.pop("data_type")index_params={}if"index_params"inkwargs:index_params=kwargs.pop("index_params")search_params={}if"search_params"inkwargs:search_params=kwargs.pop("search_params")keys=Noneif"keys"inkwargs:keys=kwargs.pop("keys")try:tair_vector_store=cls(embedding,url,index_name,content_key=content_key,metadata_key=metadata_key,search_params=search_params,**kwargs,)exceptValueErrorase:raiseValueError(f"tair failed to connect: {e}")# Create embeddings for documentsembeddings=embedding.embed_documents(texts)tair_vector_store.create_index_if_not_exist(len(embeddings[0]),distance_type,index_type,data_type,**index_params,)tair_vector_store.add_texts(texts,metadatas,keys=keys)returntair_vector_store
[docs]@staticmethoddefdrop_index(index_name:str="langchain",**kwargs:Any,)->bool:""" Drop an existing index. Args: index_name (str): Name of the index to drop. Returns: bool: True if the index is dropped successfully. """try:fromtairimportTairasTairClientexceptImportError:raiseImportError("Could not import tair python package. ""Please install it with `pip install tair`.")url=get_from_dict_or_env(kwargs,"tair_url","TAIR_URL")try:if"tair_url"inkwargs:kwargs.pop("tair_url")client=TairClient.from_url(url=url,**kwargs)exceptValueErrorase:raiseValueError(f"Tair connection error: {e}")# delete indexret=client.tvs_del_index(index_name)ifret==0:# index not existlogger.info("Index does not exist")returnFalsereturnTrue
[docs]@classmethoddeffrom_existing_index(cls,embedding:Embeddings,index_name:str="langchain",content_key:str="content",metadata_key:str="metadata",**kwargs:Any,)->Tair:"""Connect to an existing Tair index."""url=get_from_dict_or_env(kwargs,"tair_url","TAIR_URL")search_params={}if"search_params"inkwargs:search_params=kwargs.pop("search_params")returncls(embedding,url,index_name,content_key=content_key,metadata_key=metadata_key,search_params=search_params,**kwargs,)