Weaviate中Exact Match向量搜索异常问题求助
问题原因
Weaviate的Equal操作符作用于text类型字段时,并不执行严格的字符串全等匹配——哪怕你设置了tokenization: "field",它依然会把查询值当作全文检索关键词,匹配包含该关键词的字段内容。所以当你用valueText: 'Lilice'查询时,'Sustainable Lilice'因为包含'Lilice'子串,会被命中返回。
实现精准匹配的方法
有两种可靠方案可以实现严格的字符串与向量精准匹配:
方案1:使用Like操作符加精确匹配通配符
利用Like操作符结合正则通配符^(匹配字符串开头)和$(匹配字符串结尾),实现严格的完全匹配:
where_filter = { "path": ["tag"], "operator": "Like", "valueText": '^Lilice$' } result = ( client.query .get('tag_embeddings', ['tag']) .with_additional("vector") .with_where(where_filter) .with_limit(1) .do() )
方案2:将字段类型改为string
如果你的tag字段不需要全文检索能力,直接把dataType改为string类型——string类型字段的Equal操作符默认执行严格的字符串全等匹配:
修改后的Schema
class_obj = { "class": "tag_embeddings", "properties": [ { "name": "tag", "dataType": ["string"], # 改为string类型 }, ], "vectorizer": "none", "tokenization": "field" # string类型下该配置不影响,可保留或删除 } client.schema.create_class(class_obj)
原查询代码可直接使用
此时你原来的Equal查询逻辑就能精准匹配到tag为'Lilice'的条目,不会返回包含该子串的其他结果。
内容的提问来源于stack exchange,提问作者user27701619
相关产品推荐
相关产品推荐

