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))