如何让SOLR排除字段中指定ID的匹配结果?
Solr排除指定Category ID的正确查询方式
你之前的错误在于把OR换成了AND——这逻辑完全不对,一个记录的categoryId不可能同时等于多个不同的ID,用AND相当于没排除任何记录。
正确的做法是保留括号里的OR,然后对整个匹配组取反,因为我们要排除的是categoryId属于指定列表中任意一个值的记录。
写法一:使用!取反分组
$query->createFilterQuery('categoryId')->setQuery( sprintf('!categoryId:(%s)', implode(' OR ', $categoryId)) );
或者用NOT替代!,语义更直观:
$query->createFilterQuery('categoryId')->setQuery( sprintf('NOT categoryId:(%s)', implode(' OR ', $categoryId)) );
写法二:逐个排除每个ID
根据逻辑等价规则,上面的写法和逐个排除每个ID(用AND连接)效果完全一致:
$excludedClauses = array_map(function($id) { return "!categoryId:$id"; }, $categoryId); $query->createFilterQuery('categoryId')->setQuery( implode(' AND ', $excludedClauses) );
两种写法功能相同,第一种更简洁,适合ID数量较多的场景。
内容的提问来源于stack exchange,提问作者user3174311
相关产品推荐
相关产品推荐

