Bug描述
OpensearchVectorClient
使用 filters.legacy_filters()
解析给定的 MetadataFilters
。这些应该允许嵌套 MetadataFilters
,但当呈现一个嵌套过滤器时,会出现一个
AttributeError: 'MetadataFilters' object has no attribute 'operator'
如果呈现一个嵌套对象,它可能应该抛出一个错误。理想情况下, OpensearchVectorClient._parse_filters
可以调整为 MetadataFilters
结构。
在 MetadataFilters
中的实现:
llama_index/llama-index-core/llama_index/core/vector_stores/types.py
第 175 行到第 185 行:
| | deflegacy_filters(self) ->List[ExactMatchFilter]: |
| | """将 MetadataFilters 转换为 legacy ExactMatchFilters.""" |
| | filters= [] |
| | forfilterinself.filters: |
| | iffilter.operator!=FilterOperator.EQ: |
| | raiseValueError( |
| | "Vector Store 只支持精确匹配过滤器。" |
| | "请使用 ExactMatchFilter 或 FilterOperator.EQ 代替。" |
| | ) |
| | filters.append(ExactMatchFilter(key=filter.key, value=filter.value)) |
| | returnfilters |
在 OpensearchVectorClient
中的实现:
llama_index/llama-index-integrations/vector_stores/llama-index-vector-stores-opensearch/llama_index/vector_stores/opensearch/base.py
第 213 行到第 222 行:
| | def_parse_filters(self, filters: Optional[MetadataFilters]) ->Any: |
| | pre_filter= [] |
| | iffiltersisnotNone: |
| | forfinfilters.legacy_filters(): |
| | ifisinstance(f.value, str): |
| | pre_filter.append({f.key: f.value}) |
| | else: |
| | pre_filter.append({f.key: json.loads(str(f.value))}) |
| | |
| | returnpre_filter |
版本
llama-index-core==0.10.47; llama-index-vector-stores-opensearch==0.1.12
重现步骤
创建一个嵌套的 MetadataFilters
示例并调用 legacy_filters()
。
1条答案
按热度按时间vwoqyblh1#
要解决
MetadataFilters.legacy_filters()
与嵌套过滤器在OpensearchVectorClient
中的问题,您可以更新_parse_filters
方法以正确处理嵌套的MetadataFilters
。以下是递归处理嵌套过滤器的_parse_filters
方法的修订版本:def _parse_filters(self, filters: Optional[MetadataFilters]) -> Any:
def parse_filter(filter):
if isinstance(filter, MetadataFilters):
return {"bool": {"filter": parse_filters(filter)}}
else:
return {filter.key: json.loads(str(filter.value))}
此更新后的方法使用辅助函数
parse_filter
来处理MetadataFilters
和单个过滤器,使其能够递归处理嵌套过滤器。直接从MetadataFilters
对象访问filters
属性,确保正确解析嵌套过滤器。通过实施此更改,
OpensearchVectorClient
将能够在不遇到AttributeError
1(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-opensearch/llama_index/vector_stores/opensearch/base.py)的情况下处理嵌套的MetadataFilters
。