5分钟掌握Qdrant Filter DSL:从入门到实战的查询语法指南

【免费下载链接】qdrant Qdrant - 针对下一代人工智能的高性能、大规模向量数据库。同时提供云端版本 【免费下载链接】qdrant 项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant

你是否还在为向量数据库的复杂查询而头疼?是否想快速掌握如何精准筛选所需数据?本文将带你一文搞定Qdrant的Filter DSL(领域特定语言)查询语法,让你轻松实现高效的数据过滤。读完本文,你将能够:理解Filter DSL的核心概念、掌握常用过滤条件的编写方法、学会组合多种条件进行复杂查询,以及通过实战案例巩固所学知识。

Filter DSL简介

Filter DSL(Domain-Specific Language,领域特定语言)是Qdrant向量数据库中用于实现数据过滤的强大工具。它允许用户通过JSON格式的查询语句,根据向量的元数据(payload)对检索结果进行精确筛选。Qdrant针对下一代人工智能应用场景设计,提供了高性能、大规模的向量存储和检索能力,而Filter DSL则是其实现复杂数据筛选的关键组件。

Qdrant的Filter DSL支持多种过滤条件,包括关键词匹配、数值范围、地理空间查询等,能够满足不同应用场景下的数据筛选需求。通过合理使用Filter DSL,用户可以大幅提高向量检索的准确性和效率,减少不必要的计算资源消耗。

核心过滤条件

Filter DSL的核心在于各种过滤条件的使用。Qdrant提供了丰富的过滤条件类型,以下是几种常用的过滤条件及其使用方法。

匹配条件(Match)

匹配条件用于检查元数据中某个字段的值是否满足特定条件。常见的匹配类型包括:精确值匹配、文本匹配、任意匹配和排除匹配等。

精确值匹配(value)用于检查字段是否等于某个特定值。例如,筛选出城市为"Berlin"的向量:

{
  "must": [
    {
      "key": "city",
      "match": {
        "value": "Berlin"
      }
    }
  ]
}

文本匹配(text)用于对文本字段进行全文搜索。例如,筛选出uuid字段包含特定文本的向量:

{
  "must": [
    {
      "key": "uuid",
      "match": {
        "text": "uuid_2"
      }
    }
  ]
}

任意匹配(any)用于检查字段值是否属于指定的一组值中的任意一个。例如,筛选出uuid为uuid_1或uuid_2的向量:

{
  "must": [
    {
      "key": "uuid",
      "match": {
        "any": ["uuid_1", "uuid_2"]
      }
    }
  ]
}

排除匹配(except)用于检查字段值是否不属于指定的一组值。例如,筛选出uuid既不是uuid_1也不是uuid_2的向量:

{
  "must": [
    {
      "key": "uuid",
      "match": {
        "except": ["uuid_1", "uuid_2"]
      }
    }
  ]
}

上述匹配条件的使用示例可以在tests/openapi/test_query_full.py文件中找到更多实际应用场景。

逻辑组合条件

逻辑组合条件用于将多个过滤条件组合起来,实现更复杂的筛选逻辑。Qdrant支持三种逻辑组合方式:必须满足(must)、必须不满足(must_not)和应该满足(should)。

必须满足(must)表示所有子条件都必须满足。例如,筛选出城市为"Berlin"且count大于100的向量:

{
  "must": [
    {
      "key": "city",
      "match": {
        "value": "Berlin"
      }
    },
    {
      "key": "count",
      "match": {
        "value": 100
      }
    }
  ]
}

必须不满足(must_not)表示所有子条件都必须不满足。例如,筛选出城市不是"Berlin"的向量:

{
  "must_not": [
    {
      "key": "city",
      "match": {
        "value": "Berlin"
      }
    }
  ]
}

应该满足(should)表示至少有一个子条件满足。例如,筛选出城市是"Berlin"或者count大于100的向量:

{
  "should": [
    {
      "key": "city",
      "match": {
        "value": "Berlin"
      }
    },
    {
      "key": "count",
      "match": {
        "value": 100
      }
    }
  ]
}

最小应该满足条件(Min Should)

最小应该满足条件(min_should)用于指定一组条件,并要求至少满足其中的一定数量。它包含两个参数:conditions(条件列表)和min_count(最小满足数量)。

例如,筛选出至少满足以下两个条件中的一个的向量:城市是"Berlin"或"Moscow",或者count等于0:

{
  "min_should": {
    "conditions": [
      {
        "key": "city",
        "match": {
          "any": ["Berlin", "Moscow"]
        }
      },
      {
        "key": "count",
        "match": {
          "value": 0
        }
      }
    ],
    "min_count": 1
  }
}

组合查询

在实际应用中,往往需要组合多种过滤条件来实现复杂的查询需求。Qdrant的Filter DSL支持嵌套组合各种条件,以满足不同场景下的筛选需求。

简单组合示例

例如,筛选出城市不是"Berlin",且count大于2的向量:

{
  "must": [
    {
      "must_not": [
        {
          "key": "city",
          "match": {
            "value": "Berlin"
          }
        }
      ]
    },
    {
      "key": "count",
      "match": {
        "value": 2
      }
    }
  ]
}

复杂组合示例

以下是一个更复杂的组合查询示例,它结合了must、must_not和should条件:

{
  "must": [
    {
      "key": "count",
      "match": {
        "value": 3
      }
    }
  ],
  "must_not": [
    {
      "key": "city",
      "match": {
        "value": "London"
      }
    }
  ],
  "should": [
    {
      "key": "city",
      "match": {
        "value": "Moscow"
      }
    },
    {
      "key": "square",
      "match": {
        "value": 12.5
      }
    }
  ]
}

这个查询的含义是:筛选出count等于3,且城市不是"London",同时城市是"Moscow"或者square等于12.5的向量。

实战案例

为了更好地理解Filter DSL的使用方法,我们以一个实际的测试文件为例,分析其中的Filter DSL查询语句。

tests/consensus_tests/test_points_query.py文件中,定义了一个用于过滤的条件:

filter = {
    "must_not": [
        {
            "key": "city",
            "match": {
                "value": "Berlin"
            }
        }
    ]
}

这个过滤条件的作用是排除城市为"Berlin"的向量。在测试中,它被用于多种查询场景,例如:

  1. nearest search & query with filter:在最近邻搜索中应用过滤条件。
  2. request filter & source filters:比较不同位置应用过滤条件的效果。
  3. scroll:在滚动查询中使用过滤条件。
  4. scroll order by asc 和 scroll order by desc:在按不同顺序滚动查询时应用过滤条件。

通过这些测试场景的验证,可以确保Filter DSL在各种查询操作中的正确性和稳定性。

总结与展望

通过本文的介绍,我们详细了解了Qdrant Filter DSL的核心概念、常用过滤条件、组合查询方法以及实战应用。Filter DSL作为Qdrant向量数据库的重要组成部分,为用户提供了强大而灵活的数据过滤能力,能够满足不同应用场景下的查询需求。

未来,Qdrant团队计划进一步增强Filter DSL的功能,例如支持更复杂的数值范围查询、更高级的文本搜索功能等。我们可以期待在docs/roadmap/roadmap-2024.md等官方文档中看到更多关于Filter DSL的更新和改进。

希望本文能够帮助你快速掌握Qdrant Filter DSL的使用方法。如果你有任何问题或建议,欢迎在Qdrant的社区论坛或GitHub仓库中提出。记得点赞、收藏、关注我们,获取更多关于Qdrant的技术文章和实战教程!下期我们将介绍Qdrant的性能优化技巧,敬请期待。

【免费下载链接】qdrant Qdrant - 针对下一代人工智能的高性能、大规模向量数据库。同时提供云端版本 【免费下载链接】qdrant 项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐