用于嵌套模糊搜索的条件ElasticSearch过滤器

hgtggwj0  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(0)|浏览(171)

我有一个对我的索引工作查询,但我有困难得到一个条件过滤器工作。
我的查询如下:

var firstSearchResponse = client.Search<IndexedUser>(s => s
            .Query(q =>
                (q
                .Match(m => m
                    .Field(f => f.FirstName)
                    .Query(term)
                    .Fuzziness(Fuzziness.EditDistance(2))
                )
                ||
                q.Match(m => m
                    .Field(f => f.LastName)
                    .Query(term)
                    .Fuzziness(Fuzziness.EditDistance(2))
                ))
                &&
                (
                 q.Match(m => m
                    .Field(f => f.IsSearchable)
                    .Query("true")

                 )
                )
            );

不过,现在我想说的是,如果一个用户通过一个城市,或一个州,或两者,然后过滤这些字段中的每一个,只返回这些结果。
举个例子,如果我通过了纽约的一个城市,那么只过滤那些结果。
我该怎么做?
我尝试使用postfilter,但在传入输入时似乎不起作用:

var filters = new List<Func<QueryContainerDescriptor<IndexedUser>, QueryContainer>>();

                //If city was provided, then search on that
                if (!String.IsNullOrEmpty(city))
                    filters.Add(fq => fq.Terms(t => t.Field(f => f.City).Terms(city)));

                //If state was provided, then search on that
                if (!String.IsNullOrEmpty(state))
                    filters.Add(fq => fq.Terms(t => t.Field(f => f.State).Terms(state)));

然后在我的查询结束时,添加以下内容:

var firstSearchResponse = client.Search<IndexedUser>(s => s
                    .Query(q =>
                        (q
                        .Match(m => m
                            .Field(f => f.FirstName)
                            .Query(term)
                            .Fuzziness(Fuzziness.EditDistance(2))
                        )
                        ||
                        q.Match(m => m
                            .Field(f => f.LastName)
                            .Query(term)
                            .Fuzziness(Fuzziness.EditDistance(2))
                        ))
                        &&
                        (
                         q.Match(m => m
                            .Field(f => f.IsSearchable)
                            .Query("true")

                         )
                        )
                    ).PostFilter(p => p.Bool(q => q.Filter(filters))));

..如果我添加了postfilter,除非我真的为城市或州传递了一个值,否则它会工作。我是误用了postfilter,还是上面有逻辑缺陷?
非常感谢您的帮助/指导!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题