当前位置: 首页 > 面试题库 >

NEST有多个条件的条件过滤器查询

靳金鹏
2023-03-14
问题内容

我想像这样做一个ElasticSearch查询:

{
    "query" :
    {
        "bool" :
        {
            "filter" : [
                {
                    "terms" :
                    {
                        "name" : ["name1", "name2"]
                    }
                },
                {
                    "terms" :
                    {
                        "color" : ["orange", "red"]
                    }
                }
            ]
        }
    }
}

我试图像这样在NEST中实现它:

_elasticClient
    .SearchAsync<MyDocument>(s =>
        s.Index("myindex")
            .Query(q => q
                .Bool(bq => bq
                    .Filter(fq =>
                    {
                        QueryContainer query = null;

                        if (nameList.Any()) {
                            query &= fq.Terms(t => t.Field(f => f.Name).Terms(nameList));
                        }

                        if (colorList.Any()) {
                            query &= fq.Terms(t => t.Field(f => f.Color).Terms(colorList));
                        }

                        return query;
                    })
                )
            )
    );

但这给了我这样的查询,其中的过滤器包装在 布尔值中

{
    "query" :
    {
        "bool" :
        {
            "filter" : [
                {
                    "bool" :
                    {
                        "must" : [
                            {
                                "terms" :
                                {
                                    "name" : ["name1", "name2"]
                                }
                            },
                            {
                                "terms" :
                                {
                                    "color" : ["orange", "red"]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中?


问题答案:

如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示:

var nameList = new[] {"a", "b"};
var colorList = new[] {1, 2};

var filters = new List<Func<QueryContainerDescriptor<MyDocument>, QueryContainer>>();
if (nameList.Any())
{
     filters.Add(fq=> fq.Terms(t => t.Field(f => f.Name).Terms(nameList)));
}

if (colorList.Any())
{
    filters.Add(fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList)));
}

ISearchResponse<Property> searchResponse =
     elasticClient.Search<MyDocument>(x => x.Query(q => q
     .Bool(bq => bq.Filter(filters))));

如果在进行过滤器查询之前不需要检查任何条件,则可以使用类似的方法:

ISearchResponse<MyDocument> searchResponse =
elasticClient.Search<MyDocument>(x => x.Query(q => q
.Bool(bq => bq
.Filter(
        fq => fq.Terms(t => t.Field(f => f.Name).Terms(nameList)),
        fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList))
        ))));


 类似资料:
  • 问题内容: 我正在尝试使用Pandas在几个条件下进行布尔索引。我原来的DataFrame称为。如果执行以下操作,将得到预期的结果: 但是,如果我这样做(我认为应该是等效的),则不会返回任何行: 知道导致差异的原因是什么? 问题答案: 使用是因为运算符优先级: 或者,在单独的行上创建条件: 样品 :

  • 问题内容: 在我当前的项目中,我遇到了使用hibernate条件查询获取实体的问题。我有以下实体: 教授,其中包含学生名单 学生,其中包含作业列表。 作业,其中包含分配到的学生的ID。 现在,我想获得与教授有关的所有作业,即教授分配给他的学生的所有作业。 此查询显示我要在条件查询中实现的内容。 如何使用hibernate条件API实施此查询? 问题答案: 假设您的表格是这样的: 使用别名的简单示例

  • 问题内容: 谁能向我解释为什么我对这两个表达式会得到不同的结果?我正在尝试在2个日期之间进行过滤: 结果:37M 与 结果:25M 它们有何不同?在我看来,他们应该产生相同的结果 问题答案: TL; DR 要传递多个条件或使用对象和逻辑运算符(,,)。请参见Pyspark:when子句中的多个条件。 您还可以使用 单个 SQL字符串: 实际上,在以下两者之间使用更有意义: 第一种方法甚至不是远程有

  • 问题内容: 在Google上搜索后,我发现Elasticsearch的最大查询条件限制为1024? 它是可配置的吗?如果可以,请提供任何步骤。 谢谢,Sameer 问题答案: 默认值为1024,但是它是可配置的。在elasticsearch配置文件(例如yml文件)中,设置提及的设置:例如。

  • 问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器

  • 有时您希望筛选具有多个条件的: 也可以使用复杂条件和单个: 第一种方法在可读性方面胜出,但在性能方面,什么更好呢?