Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MilvusVectorStore: Add support for nested MetadataFilters and FilterOperator.IS_EMPTY #16329

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

RasmusAntons
Copy link
Contributor

@RasmusAntons RasmusAntons commented Oct 2, 2024

Description

Allows nested MetadataFilters by recursively evaluating them and wrapping the result in parentheses.

For example:

filters = MetadataFilters(
    filters=[
        MetadataFilter(key="a", value=1, operator=FilterOperator.EQ),
        MetadataFilters(
            filters=[
                MetadataFilter(key="b", value=2, operator=FilterOperator.EQ),
                MetadataFilter(key="c", value=3, operator=FilterOperator.EQ)
            ],
            condition=FilterCondition.OR
        )
    ],
    condition=FilterCondition.AND
)
expr = _to_milvus_filter(filters)
assert expr == "(a == 1 and (b == 2 or c == 3))"

Also allows using FilterOperator.IS_EMPTY, which is translated to array_length(key) == 0.

Fixes #16310

Version Bump?

Did I bump the version in the pyproject.toml file of the package I am updating? (Except for the llama-index-core package)

  • Yes
  • No

Type of Change

Please delete options that are not relevant.

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration

  • Added new unit/integration tests
  • Added new notebook (that tests end-to-end)
  • I stared at the code and made sure it makes sense

Suggested Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • I have added Google Colab support for the newly added notebooks.
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • I ran make format; make lint to appease the lint gods

@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Oct 2, 2024
@RasmusAntons RasmusAntons marked this pull request as draft October 2, 2024 09:38
@RasmusAntons
Copy link
Contributor Author

RasmusAntons commented Oct 2, 2024

Looking at the comment for FilterOperator.IS_EMPTY, the filter should match if "the field is not exist or empty (null or empty array)". I'm only checking for an empty array, I'll see if I can extend that to nonexistent/null fields.

@RasmusAntons RasmusAntons marked this pull request as ready for review October 2, 2024 09:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
size:M This PR changes 30-99 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Question]: Should MetadataFilters for vector stores support nesting?
1 participant