Nest Elastic - 构建动态嵌套查询

2024-05-10

我必须使用 Nest 查询嵌套对象,但是查询是以动态方式构建的。下面的代码演示了以静态方式对嵌套“书籍”进行查询

QueryContainer qry;
qry = new QueryStringQuery()
{
    DefaultField = "name",
    DefaultOperator = Operator.And,
    Query = "salman"
};

QueryContainer qry1 = null;

qry1 = new RangeQuery() // used to search for range ( from , to)
{
    Field = "modified",
    GreaterThanOrEqualTo = Convert.ToDateTime("21/12/2015").ToString("dd/MM/yyyy"),
};

QueryContainer all = qry && qry1;

var results = elastic.Search<Document>(s => s
   .Query(q => q
        .Bool(qb => qb
            .Must(all)))
    .Filter(f =>
            f.Nested(n => n
                 .Path("books")
                    .Filter(f3 => f3.And(
                                f1 => f1.Term("book.isbn", "122"),
                                f2 => f2.Term("book.author", "X"))

                            )
                    )
            )

    );

问题是我需要以动态方式组合“书籍”的多个查询(使用 And、OR 运算符)。例如,获取满足以下条件的书籍:

  1. 条件 1:作者为“X”且 isbn“1”的书籍
  2. 条件 2:作者为“X”且 isbn“2”的书籍
  3. 条件 3:作者为“Z”且 isbn“3”的书籍
  4. 其他条件: .....

现在,嵌套查询中的过滤器应该在以下情况下检索书籍:
条件1AND条件2Or条件3

假设我的类名 FilterOptions 包含以下属性:

  1. 字段名
  2. Value
  3. 运算符(将组合下一个过滤器)

我将循环给定的 FilterOptions 数组来构建查询。

问题:

我应该使用什么来构建嵌套查询?它是 FilterDeciptor 吗?如何组合它们将嵌套查询添加到搜索方法中?

请推荐任何有价值的链接或示例?


我同意帕韦洛克的观点,看来你的前两个条件是矛盾的,如果 AND 在一起就行不通。忽略这一点,这是我的解决方案。我以允许超过您所拥有的三个特定条件的方式实现了这一点。我也觉得它更适合bool陈述。

QueryContainer andQuery = null;
QueryContainer orQuery = null;
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.And))
{
    andQuery &= new TermQuery
    {
        Field = authorFilter.FieldName,
        Value = authorFilter.Value
    };
}
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.Or))
{
    orQuery |= new TermQuery
    {
        Field = authorFilter.FieldName,
        Value = authorFilter.Value
    };
}

之后,在.Nested我会打电话:

.Path("books")
    .Query(q=>q
        .Bool(bq=>bq
            .Must(m=>m.MatchAll() && andQuery)
            .Should(orQuery)
    ))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nest Elastic - 构建动态嵌套查询 的相关文章

随机推荐

  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • 在网页上写乐谱[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在网页中编写乐谱和和弦 有没有可用的库 例如用于数学的 Mathjax 如果没有 那么还有其
  • 从数组中查找前 N 个条目

    我的收藏结构如下 id 1 Trips EndID 5 Tripcount 12 EndID 6 Tripcount 19 id 2 Trips EndID 4 Tripcount 12 EndID 5 Tripcount 1
  • Iphone 上的 Javascript 日期解析

    我正在开发一个针对移动设备的离线 Javascript 网站 iPhone 就是这样的一种移动设备 我正在尝试从 REST API JSON 对象的成员 解析日期 我在用着 Date parse 2010 03 15 10 30 00 这适
  • 如何更改 Codeigniter 中的配置文件路径?

    我使用 Codeigniter 框架 你知道当我尝试加载配置文件然后使用它时 我做了类似的事情 this gt load gt config myconfig TRUE myconfig php 文件位于应用程序文件夹内 applicati
  • VS2012 中的实体框架问题 - 重命名属性不粘

    我试图在 VS2012 中创建一个新项目 其中包含管理 MVC4 项目 网站 MVC4 项目和通用实体框架 dll 项目 我使用了现有的数据库并从中生成了我的实体 我更新了一些关系属性的名称并保存 然后 我将对实体框架项目的引用添加到我的两
  • iPhone 存储大量图像

    我有大量与 sqlite 数据库中的记录相对应的图像 我应该把它们存放在哪里 我有同一张图像的 3 个版本 大号 中号 拇指号 我不想将它们存储在数据库表中 而是从每条记录中引用它们 所有图像都具有相同的名称 每个小 中和大图像文件都将被称
  • Android TableRow 垂直拉伸以填充屏幕

    我正在尝试创建一个电话拨号器视图 使用 TableLayout 在 3x4 网格中创建 12 个按钮 我希望行垂直拉伸以平等地使用所有可用空间 但似乎 fill parent 在 TableRows 上不起作用 我不想使用 setMinim
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 如何从 php 代码更改 php 设置?

    我想更改 php 设置 但从 php 页面而不是 php ini 更改 我要更改的设置是 upload max filesize post max size and memory limit 如果您有AllowOverride 选项 您可以
  • 使用 Intern 测试自定义 JavaScript(不是 Node 模块)

    是否可以为自定义客户端创建和运行测试套件 JavaScript 不是作为 Node 模块创建的 应该如何 那么配置要改吗 Intern 配置中有 loader 部分 指定了 如果我做对了 将会加载的包 是否有必要 以某种方式在这里包含我的自
  • 运行多线程时双重释放或损坏

    我在 C 程序中遇到运行时错误 双重释放或损坏 该程序调用可靠的库 ANN 并使用 OpenMP 并行化 for 循环 glibc detected home tim test debug test double free or corru
  • Diesel:添加子查询的结果

    给出下表 accounts id INTEGER opening balance INTEGER transactions debit INTEGER credit INTEGER amount INTEGER foreign key de
  • Typescript 编译错误:类型“typeof e”上不存在属性“bodyParser”

    我想在我的节点 express 环境中使用打字稿 托管在 Cloud 9 ide 中 我在尝试让编译器编译 app ts 时遇到问题 它出现了几个错误 其中属性 bodyParser 在类型 typeof e 上不存在就是其中之一 我在应用
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • 使用 GDBus 通过 D-Bus 发送字节数组(类型 `ay`)

    我正在尝试使用 DBus 绑定通过 D Bus 获取字节数组 你能告诉我如何实现这一目标吗 我尝试谷歌搜索但没有帮助 字节数组包含图像文件 因此无法转换为 charbytearray 任何帮助表示赞赏 我使用 XML 做了一些测试 其中使用
  • 平滑地将渐变应用于 UIImage

    我正在尝试使用 CoreGraphic 将渐变应用于 UIImage 然而 我得到的结果不是很好 我想在图像底部创建一个黑色到透明的渐变 以便为我放置一些文本创建对比度 然而 我能够实现的渐变与图像不能很好地融合 你可以清楚地看到中心的分离
  • Google Cloud Speech API 使用的端点/端口是什么

    通过流 API 使用 Google Cloud Speech API 对音频流执行流式语音识别 https cloud google com speech to text docs streaming recognize performin
  • Nest Elastic - 构建动态嵌套查询

    我必须使用 Nest 查询嵌套对象 但是查询是以动态方式构建的 下面的代码演示了以静态方式对嵌套 书籍 进行查询 QueryContainer qry qry new QueryStringQuery DefaultField name D