在查询中使用嵌套对象会触发Nest ElasticSearch中的多个索引

时间:2017-12-27 11:50:41

标签: nest

我在产品帐户索引中有两种类型 producttype accounttype ,我需要构建一个搜索查询以同时点击它们。

现在我最终得到了以下查询:

var searchResponse = elasticClient.Search<object>(s => s
            .Index(indices)
            .Type(Types.Type(typeof(ProductType), typeof(accountType)))
            .Query(q => q
                 q.Nested(n => n
                   .Path(Infer.Field<ProductType>(ff => ff.Keywords))
                   .Query(nq => nq
                       .Match(t => t
                         .Field(Infer.Field<ProductType>(ff => ff.Keywords.First().Keyword))
                         .Query(query)
                       )
                       ||
                       nq.Term(Infer.Field<ProductType>(ff => ff.Keywords.First().Keyword.Suffix("keyword")), query)
                   )
                 )
                && 
                +q.Term("_type", "producttype") 
                || 
                q.MultiMatch(m => m
                    .Fields(f => f
                        .Field(Infer.Field<accountType>(ff => ff.AccountName, 1.5))
                        .Field(Infer.Field<accountType>(ff => ff.Description, 0.8))
                    )
                    .Operator(Operator.Or)
                    .Query(query)
                ) && 
                +q.Term("_type", "accounttype")
            )
        );

当我运行此查询时它不起作用,因为在accounttype中找不到关键字嵌套对象(但在我的情况下,我按_type过滤,所以它应该工作)。

那么当我在一个索引中嵌套对象时,如何通过_index / _type进行过滤?

1 个答案:

答案 0 :(得分:0)

尝试在嵌套对象中添加.IgnoreUnmapped(true)。

var searchResponse = elasticClient.Search<object>(s => s
            .Index(indices)
            .Type(Types.Type(typeof(ProductType), typeof(accountType)))
            .Query(q => q
                 q.Nested(n => n
                   .IgnoreUnmapped(true)
                   .Path(Infer.Field<ProductType>(ff => ff.Keywords))
                   .Query(nq => nq
                       .Match(t => t
                         .Field(Infer.Field<ProductType>(ff => ff.Keywords.First().Keyword))
                         .Query(query)
                       )
                       ||
                       nq.Term(Infer.Field<ProductType>(ff => ff.Keywords.First().Keyword.Suffix("keyword")), query)
                   )
                 )
                && 
                +q.Term("_type", "producttype") 
                || 
                q.MultiMatch(m => m
                    .Fields(f => f
                        .Field(Infer.Field<accountType>(ff => ff.AccountName, 1.5))
                        .Field(Infer.Field<accountType>(ff => ff.Description, 0.8))
                    )
                    .Operator(Operator.Or)
                    .Query(query)
                ) && 
                +q.Term("_type", "accounttype")
            )
        );