布隆过滤器预热(ES取数)与使用

14 阅读1分钟

1、依赖

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>16.0</version>
            </dependency>

2、注入布隆过滤Bean(根据数据量确认预计值)

@Component
public class BloomFilterConfig {
    @Resource
    private LqElasticsearchService esService;

    @Bean
    public BloomFilter<CharSequence> lqzlJyBloomFilter(){
        //预计插入值
        int size = esService.getLqzlSybCount();
        BloomFilter<CharSequence> filter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()),Math.max(LqzlConstants.BLOOM_ES_SIZE,size),LqzlConstants.BLOOM_FPP);
        return filter;
    }
}

3、预热过滤器

@Slf4j
@Component
public class BloomFilterInitConfig implements InitializingBean {

    @Resource
    private RestHighLevelClient restHighLevelClient;

    private final static String ES_INDEX_SS_LQZLSB_ZZS_SSZT = "ss_lqazl_zzssszt";

    @Autowired
    @Qualifier("lqzlJyBloomFilter")
    BloomFilter<CharSequence> lqzljyFilter;

    @Override
    @Scheduled(fixedRate = 1000*60*60*24)
    public void afterPropertiesSet() {

        log.info("blooom put start");
        this.putZtbAlltoBloom();
        log.info("bloom put end");
    }
    public void putZtbAlltoBloom(){
        SearchRequest request = new SearchRequest(ES_INDEX_SS_LQZLSB_ZZS_SSZT);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().size(LqzlConstants.BLOOM_ES_SIZE).sort("lrrq", SortOrder.DESC);
        SearchResponse response = null;
        request.source(sourceBuilder);
        try {
            response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            SearchHit[] searchHits = response.getHits().getHits();
            if(!ObjectUtils.isEmpty(searchHits)){
                do{
                    for (SearchHit hit :searchHits) {
                        ObjectMapper objectMapper = new ObjectMapper();
                        LqzlPcSyb lqzlPcSyb = objectMapper.readValue(hit.getSourceAsString(), LqzlPcSyb.class);
                        if (!ObjectUtils.isEmpty(lqzlPcSyb)) {
                            StringBuilder stringBuilder = new StringBuilder();
                            String key = stringBuilder.append(lqzlPcSyb.get1()).append(lqzlPcSyb.get2()).append(lqzlPcSyb.get3()).toString();
                            if(!ObjectUtils.isEmpty(key)){
                                lqzljyFilter.put(JSONUtil.toJsonStr(key));
                            }
                        }
                    }

                    SearchHit[] hits = response.getHits().getHits();
                    Object[] lastNum = hits[hits.length-1].getSortValues();

                    sourceBuilder.searchAfter(lastNum);
                    request.source(sourceBuilder);

                    response = restHighLevelClient.search(request,RequestOptions.DEFAULT);
                }while (response.getHits().getHits().length != 0);
            }
        }catch (IOException e){
            log.error("lqzl es query error", GyUtil.getStackTrace(e));
        }
    }

}

4、使用

lqzlfilter.mightContain(JSONUtil.toJsonStr(key))

这里是引用 blog.csdn.net/m0_52256357…