栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

nested检索, 父子查询

nested检索, 父子查询

过滤nested文档

6.1前 _type 不是以 "__"开头的。

6.1之后根据是否存在_primary_term属性

org.elasticsearch.index.query.NestedQueryBuilder doToQuery

    
    public static Query newNonNestedFilter(Version indexVersionCreated) {
        if (indexVersionCreated.onOrAfter(Version.V_6_1_0)) {
            return new DocValuesFieldExistsQuery(SeqNoFieldMapper.PRIMARY_TERM_NAME);
        } else {
            return new BooleanQuery.Builder()
                .add(new MatchAllDocsQuery(), Occur.FILTER)
                .add(newNestedFilter(), Occur.MUST_NOT)
                .build();
        }
    }

最终会调用Lucene的ToParentBlockJoinQuery来完成查找。 

    public ESToParentBlockJoinQuery(Query childQuery, BitSetProducer parentsFilter, ScoreMode scoreMode, String path) {
        this(new ToParentBlockJoinQuery(childQuery, parentsFilter, scoreMode), path, scoreMode);
    }

父子查询

public abstract class JoinQueryBuilders {
    
    public static HasChildQueryBuilder hasChildQuery(String type, QueryBuilder query, ScoreMode scoreMode) {
        return new HasChildQueryBuilder(type, query, scoreMode);
    }

    
    public static HasParentQueryBuilder hasParentQuery(String type, QueryBuilder query, boolean score) {
        return new HasParentQueryBuilder(type, query, score);
    }

    
    public static ParentIdQueryBuilder parentId(String type, String id) {
        return new ParentIdQueryBuilder(type, id);
    }
}

最终调用了JoinUtil.createJoinQuery来完成join操作
        @Override
        public Query rewrite(IndexReader reader) throws IOException {
            Query rewritten = super.rewrite(reader);
            if (rewritten != this) {
                return rewritten;
            }
            if (reader instanceof DirectoryReader) {
                IndexSearcher indexSearcher = new IndexSearcher(reader);
                indexSearcher.setQueryCache(null);
                indexSearcher.setSimilarity(similarity);
                IndexOrdinalsFieldData indexParentChildFieldData = fieldDataJoin.loadGlobal((DirectoryReader) reader);
                OrdinalMap ordinalMap = indexParentChildFieldData.getOrdinalMap();
                // 调用JoinUtil完成join操作
                return JoinUtil.createJoinQuery(joinField, innerQuery, toQuery, indexSearcher, scoreMode,
                    ordinalMap, minChildren, maxChildren);
            } else {
                if (reader.leaves().isEmpty() && reader.numDocs() == 0) {
                    // asserting reader passes down a MultiReader during rewrite which makes this
                    // blow up since for this query to work we have to have a DirectoryReader otherwise
                    // we can't load global ordinals - for this to work we simply check if the reader has no leaves
                    // and rewrite to match nothing
                    return new MatchNoDocsQuery();
                }
                throw new IllegalStateException("can't load global ordinals for reader of type: " +
                    reader.getClass() + " must be a DirectoryReader");
            }
        }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467640.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号