首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weaviate的后滤波

Weaviate的后滤波
EN

Stack Overflow用户
提问于 2022-05-05 13:50:39
回答 1查看 152关注 0票数 1

我有一个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的“允许列表”.这是通过使用一些属性过滤掉对象来完成的。

例如,我使用的过滤器是:

代码语言:javascript
复制
where_filter_1 = {
  "path": ["user"],
  "operator": "Equal",
  "valueText": "billy"
}

这是因为我有很多用户的数据保存在这个DB和中,我希望每个用户都能够搜索他们自己的数据,在这个例子中,就是图像数据。

--这是我如何使用python 实现这一点的

代码语言:javascript
复制
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过滤器通过倒排索引结构搜索文本。

代码语言:javascript
复制
where_filter_2 = {
  "path": ["image_text"],
  "operator": "Like",
  "valueText": "Paris France"
}

我应用这样的post过滤:

代码语言:javascript
复制
 result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
                        .with_near_vector(nearVector)\
                        .with_where(where_filter_2).do()

,但是,我认为我做得不对。是一个基本的倒排索引搜索:(所以只使用文本进行搜索)

代码语言:javascript
复制
result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
                        .with_where(where_filter_2).do()

(用tqdm模块测量)给了我大约5 iters/s.,其中数据库中有38k对象。

虽然后过滤方法给了我相同的性能,以5 iters/秒的计算。

我觉得这很奇怪是错的吗?我期望性能更接近于纯向量搜索:

代码语言:javascript
复制
 result = client.query.get("Image", ["image_uri", "_additional {certainty}"])\
                        .with_near_vector(nearVector).do()

,接近60 iters/sec (平面搜索截止设置为60k,因此这里只使用蛮力搜索)。

“哪里”过滤器是否仅适用于向量搜索提供的结果?如果是这样的话,难道不是更快吗?过滤器最多只能应用于100个对象,因为这是向量搜索结果的默认数量。

这有点让人困惑。我对搜索工作的理解是错的吗?谢谢你阅读我的问题!

EN

回答 1

Stack Overflow用户

发布于 2022-05-05 14:59:51

你的问题似乎意味着你在过滤前后的方法之间切换。但截至v1.13,所有过滤过的向量搜索都是使用预过滤。目前没有后续筛选的选项。这就解释了为什么你的搜索结果是相同的。你主要是经历了建设过滤器的成本。

附文1:

我看到您使用的是Like操作符。只有在使用通配符时,Like运算符才与Equal运算符不同。由于您没有使用它们,所以您也可以使用Equal运算符,在许多情况下,这个运算符更有效率。(我不确定这是否适用于你的情况,但总体上是正确的)

附文2:

如果您正在测量来自单个客户端线程的吞吐量,即使用python脚本中的tqdm (不使用多线程),则不会使Weaviate变得最大。由于您只开始发送第二个查询,一旦第一个查询已经处理,客户端Weaviate将在大多数情况下处于空闲状态。如果您对最大吞吐量感兴趣,则需要确保至少有与服务器上的内核相同的客户端线程,以使Weaviate最大化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72128340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档