es6.x下的filter query

说实话玩es的同学一般都会痛苦,为何api又变了?确实,明明按资深专家的建议来,但好像API完全找不到或被移除了,对,只能说es太热了。一般提到查询优化,就避不开filter query。

我们query查询的时候会去计算下查询表达式和文档的匹配程度得分,得分越高的排的越靠前,而filter不会,filter是仅仅做过滤。

filter主要通过bitset(类似于布隆过滤器,为每个倒排索引搜索结果,构建bitset),优先从最稀疏的bitset(匹配到最少文档的bitset即bitset里面1的个数最少的)开始遍历查找满足所有条件的docs,然后通过获取bitset对应的id,然后找到对应的结果返回给客户端。

bitset是会被cache的(缓存起来的不是完整结果,只是不用再次扫描倒排索引而已),这样下次用同样的条件查询,可以迅速得到结果,对于小的segment(<1000 docs或者 小于index大小的3%的)不缓存bitset(小段本身扫描很快,小段有大几率会发生合并)。当doc有更新或新增操作,cache的bitset会自动更新。

private SearchRequest buildSearchRequest(EsSchemel esSchemel, Set productIds, Set shopIds, int total) {
    if (CollectionUtils.isEmpty(productIds) || CollectionUtils.isEmpty(shopIds)) {
        return null;
    }
    String date = DateFormatUtils.format(new Date(), "yyyyMMdd");
    BoolQueryBuilder batchBoolQuery = QueryBuilders.boolQuery();
    batchBoolQuery.filter(QueryBuilders.termsQuery(ES_PRICE_COL_SHOPID, shopIds));
    batchBoolQuery.filter(QueryBuilders.termsQuery(ES_PRICE_COL_PRODUCTID, productIds));
    batchBoolQuery.filter(QueryBuilders.termsQuery(ES_PRICE_COL_SALE, "0001", "0002", "0003", "0004", ES_PRICE_VALUE_CXTYPE));
    batchBoolQuery.filter(QueryBuilders.rangeQuery(ES_PRICE_COL_END_DATE).gte(date));
    batchBoolQuery.filter(QueryBuilders.rangeQuery(ES_PRICE_COL_START_DATE).lte(date));
    return buildSearchRequest(esSchemel, batchBoolQuery, 1, productIds.size() * 2, null);
}

elasticsearch 5.0以后的版本没有FilterBuilders了,只有query, query可以用于 query context 或者 filter context。 使用filter context的方式如上。

你可能感兴趣的:(最新,elasticsearch,搜索技术)