使用场景:比如限时特价,就可用通过过滤器,只显示符合条件的特价商品
案例:
1、自定义过滤器
public class MyFilter extends Filter { /** * 目的:实现所有被删掉的索引,不再显示 * 思路:利用OpenBitSet对象,设置所有被搜索出来的对象值为1(set()),然后利用被删除条目的id,去搜索 * 索引,将搜索出来的索引宰置为0(clear()) * @param reader * @return * @throws IOException */ private String[] delId = new String[]{"1", "2", "3", "7"}; @Override public DocIdSet getDocIdSet(IndexReader reader) throws IOException { //1.先创建一个OpenBitSet,默认所有元素都是0(规则是:值为0的将会被过滤掉) OpenBitSet obs = new OpenBitSet(reader.maxDoc()); //2.所有元素都置为1 obs.set(0, reader.maxDoc()); int[] docs = new int[1]; int[] freqs = new int[1]; //3.获取id所在的doc,并将其置为0 for (String id : delId){ //4.获取TermDocs TermDocs termDocs = reader.termDocs(new Term("id", id)); //5.会将查询出来对象的位置信息存储到“docs”中,出现的频率存储到“freqs”中,返回获取的条数 int count = termDocs.read(docs, freqs); if (count == 1){ //6.将这个位置的元素置为“0” obs.clear(docs[0]); } } return obs; } }
2.使用过滤器
topDocs = indexSearcher.search(termQuery, filter, 100);