我有一个Weaviate实例正在运行(ver1.12.2)。我正在使用Python https://weaviate-python-client.readthedocs.io/en/stable/ (ver3.4.2)(添加-检索-删除objects...etc.)
我试图了解过滤向量搜索是如何工作的(在这里概述https://weaviate.io/developers/weaviate/current/architecture/prefiltering.html#recall-on-pre-filtered-searches)。
在应用预过滤时,在执行向量搜索之前构造了一个对象ids的“允许列表”.这是通过使用一些属性过滤掉对象来完成的。
例如,我使用的过滤器是:
where_filter_1 = {
"path": ["user"],
"operator": "Equal",
"valueText": "billy"
}这是因为我有很多用户的数据保存在这个DB和中,我希望每个用户都能够搜索他们自己的数据,在这个例子中,就是图像数据。
--这是我如何使用python 实现这一点的
result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
.with_where(where_filter_1)\
.with_near_vector(nearVector)\
.do()我不使用任何矢量化模块,所以我创建了自己的向量,并将其传递给DB,以便在使用.with_near_vector(nearVector)后使用with_where(where_filter_1)进行向量搜索。这确实像我期望的那样起作用,所以我认为我这样做是正确的。
,我不太确定我是否正确地应用了后过滤:每个图像都附加了一些文本。我使用Where过滤器通过倒排索引结构搜索文本。
where_filter_2 = {
"path": ["image_text"],
"operator": "Like",
"valueText": "Paris France"
}我应用这样的post过滤:
result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
.with_near_vector(nearVector)\
.with_where(where_filter_2).do(),但是,我认为我做得不对。是一个基本的倒排索引搜索:(所以只使用文本进行搜索)
result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
.with_where(where_filter_2).do()(用tqdm模块测量)给了我大约5 iters/s.,其中数据库中有38k对象。
虽然后过滤方法给了我相同的性能,以5 iters/秒的计算。
我觉得这很奇怪是错的吗?我期望性能更接近于纯向量搜索:
result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
.with_near_vector(nearVector).do(),接近60 iters/sec (平面搜索截止设置为60k,因此这里只使用蛮力搜索)。
“哪里”过滤器是否仅适用于向量搜索提供的结果?如果是这样的话,难道不是更快吗?过滤器最多只能应用于100个对象,因为这是向量搜索结果的默认数量。
这有点让人困惑。我对搜索工作的理解是错的吗?谢谢你阅读我的问题!
发布于 2022-05-05 14:59:51
你的问题似乎意味着你在过滤前后的方法之间切换。但截至v1.13,所有过滤过的向量搜索都是使用预过滤。目前没有后续筛选的选项。这就解释了为什么你的搜索结果是相同的。你主要是经历了建设过滤器的成本。
附文1:
我看到您使用的是Like操作符。只有在使用通配符时,Like运算符才与Equal运算符不同。由于您没有使用它们,所以您也可以使用Equal运算符,在许多情况下,这个运算符更有效率。(我不确定这是否适用于你的情况,但总体上是正确的)
附文2:
如果您正在测量来自单个客户端线程的吞吐量,即使用python脚本中的tqdm (不使用多线程),则不会使Weaviate变得最大。由于您只开始发送第二个查询,一旦第一个查询已经处理,客户端Weaviate将在大多数情况下处于空闲状态。如果您对最大吞吐量感兴趣,则需要确保至少有与服务器上的内核相同的客户端线程,以使Weaviate最大化。
https://stackoverflow.com/questions/72128340
复制相似问题