Elastic Search 5.x 嵌套多个查询 C#

2024-04-25

我将 C# 与这些 nuget 包一起使用;

  <package id="Elasticsearch.Net" version="5.2.0" targetFramework="net462" />
  <package id="NEST" version="5.2.0" targetFramework="net462" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" />

我想在这里做什么,我想要获得价格范围 2000 - 3000 的“白色”商品。这是一个简单的搜索 api 请求,对吗?

所以我为此编写了一个代码。这里是;

private static void Search(IElasticContext elasticContext, string indexName)
    {
        IQueryContainer termQueryContainer = new QueryContainer();
        termQueryContainer.Term = new TermQuery
                                  {
                                      Field = new Field("description"),
                                      Value = "white"
                                  };

        IQueryContainer rangeQueryContainer = new QueryContainer();
        rangeQueryContainer.Range = new NumericRangeQuery
                                    {
                                        Field = new Field("price"),
                                        LessThanOrEqualTo = 3000,
                                        GreaterThanOrEqualTo = 2000
                                    };

        //Should get 2 items.

        SearchRequest<Product> searchRequest = new SearchRequest<Product>(indexName, typeof(Product))
                                               {
                                                   Size = 10,
                                                   From = 0,
                                                   Query = (QueryContainer) rangeQueryContainer,
                                                   PostFilter = (QueryContainer) termQueryContainer
                                               };

        EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);

        Console.WriteLine(response.StatusMessage);

        if (response.IsValid)
        {
            foreach (Product product in response.Documents)
            {
                Console.WriteLine("Id: {0} | Name: {1}", product.Id, product.Name);
            }
        }
    }

但它不起作用,因为请求已成功,但结果中没有文档,但我有。我可以使用 Sense 插件查看文档。

如果我组合两个查询,nest 将在运行时抛出异常(说:“QueryContainer 只能保存一个已经包含 TermQuery 的查询”)。这里是;

另外,我无法使用 Fluent api,因为我将参数传递给我的类似存储库的函数;

    EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);

如何在 Nest dll 的 SearchRequest 中组合两个简单的查询(在描述字段中搜索和价格范围在 2000-3000 之间)。我做错了什么?


您想要做的是从两个查询形成一个复合查询,其中文档必须满足两个查询才能将其视为匹配。A boolquery 用于以这种方式组合查询 https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/bool-queries.html, 使用must子句指定必须满足两个查询。这是一个使用对象初始值设定项语法的示例

var client = new ElasticClient();
var indexName = "index-name";
var mustClauses = new List<QueryContainer>();

mustClauses.Add(new TermQuery
{
    Field = new Field("description"),
    Value = "white"
});

mustClauses.Add(new NumericRangeQuery
{
    Field = new Field("price"),
    LessThanOrEqualTo = 3000,
    GreaterThanOrEqualTo = 2000
});

var searchRequest = new SearchRequest<Product>(indexName)
{
    Size = 10,
    From = 0,
    Query = new BoolQuery { Must = mustClauses }
};

var searchResponse = client.Search<Product>(searchRequest);

随着range查询时,文档要么与查询子句匹配,要么不匹配,因此我们可以通过将其添加为bool query filter clause

var indexName = "index-name";
var mustClauses = new List<QueryContainer>();
var filterClauses = new List<QueryContainer>();

mustClauses.Add(new TermQuery
{
    Field = new Field("description"),
    Value = "white"
});

filterClauses.Add(new NumericRangeQuery
{
    Field = new Field("price"),
    LessThanOrEqualTo = 3000,
    GreaterThanOrEqualTo = 2000
});

var searchRequest = new SearchRequest<Product>(indexName)
{
    Size = 10,
    From = 0,
    Query = new BoolQuery 
    { 
        Must = mustClauses,
        Filter = filterClauses
    }
};

var searchResponse = client.Search<Product>(searchRequest);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elastic Search 5.x 嵌套多个查询 C# 的相关文章

随机推荐

  • HTML5 音频标签 - 开始和结束位置

    我有多个
  • NHibernate 中的有序多对多关系

    假设我有两个类 Item 和 ItemCollection 其中 ItemCollection 包含一个ordered具有索引的 Item 对象列表 即列表按用户指定的方式排序 我们还假设它们具有多对多关系 一个 ItemCollectio
  • 如何获取.Net(VB或C#)中参数化查询实际执行的SQL?

    是否有一种直接的方法来查看实际对底层数据库执行的 SQL 命令文本DbCommand对象 即在参数被处理成语句之后 这里是详细信息 我正在使用 VB Net 3 5 并有一个工厂对象 DbProviderFactory 和一个连接 Syst
  • 分割多重多边形

    我可以直接取出零件并把它们取出来作为它们自己的功能吗 或者这会涉及更复杂的东西吗 我正在尝试将其中一张地图拆分为较小的部分以对它们进行索引 https github com simonepri geo maps https github c
  • 如何使用 boost::serialization 序列化 std::vector ?

    class workflow private friend class boost serialization access template
  • Knockout :找出哪个可观察触发了计算

    我有一个具有多个可观察值的对象 计算中有没有一种方法可以知道哪些可观察的变化 从而知道哪个可观察触发了计算 先感谢您 马修 如果没有详细说明您想要实现的目标 我将发布此内容 希望它能有所帮助 跟踪更改的一个简单方法是使用 subscribe
  • 冲出地图

    所以我遇到这个问题 如果数组中的值高于输入的值 它应该执行某些操作 然后停止循环并且不要触及数组中的剩余值 这是到目前为止的代码 const percentages let enteredValue parseInt event targe
  • 更改 ggplot2 中的 Y 轴分隔符

    我有这段代码可以给出如下所示的图表 d ggplot df aes x Year y NAO Index width 8 geom bar stat identity aes fill NAO Index gt 0 position ide
  • Google 地图 v3 API - 自动完成(地址)

    尝试让我的谷歌地图应用程序自动完成工作 这是当前的代码 HTML
  • ScrollLeft() 不适用于 Firefox

    我这里有一个 jsfiddle http jsfiddle net stevea DyfGp 2 http jsfiddle net stevea DyfGp 2 其中外框包含延伸到视口之外的内框 这会强制出现水平滚动条 一个 向左走 Sc
  • Git 推送失败(Github/RStudio)

    我过去曾在这台机器上成功使用过 Git 但突然间我无法再将我的提交推送到 Github 存储库 我对 Git 工具链所做的最后一次更改是除了 Windows 客户端的 Github 之外还安装了 Git 1 8 5 2 除非我已经启动了 G
  • 真正的C静态局部变量替换?

    只是试图在 ObjectPascal Delphi 中实现 C C 静态局部变量的类似功能 让我们在 C 中编写以下函数 bool update position int x int y static int dx pow 1 0 rand
  • VS Code 终端无法识别 PATH 变量

    我在 PATH 中添加了一个目录 但 VS Code 中的终端无法识别我尝试从该目录运行的命令 exe 终端使用 cmd 而不是 power shell 我缺少什么 重新启动我的计算机 它就工作了 显然 VS Code 无法识别这些更改
  • 为什么插入查询有时需要很长时间才能完成?

    这是一个非常简单的问题 将数据插入表中通常工作正常 除了少数情况下插入查询需要几秒钟的时间 我是not尝试批量插入数据 因此 我为插入过程设置了一个模拟 以找出为什么插入查询偶尔需要超过 2 秒才能运行 Joshua建议索引文件可能正在调整
  • iPhone 应用程序和 PayPal

    我想将 PayPal 支付功能集成到我的本机 iPhone 应用程序中 而不使用 Web 界面 这样用户就不必离开当前应用程序 怎么可能 我应该使用 SOAP XML 请求 响应机制吗 我通过以下链接来的http www slideshar
  • 如何在keycloak登录页面实现Recaptcha

    我想在 keycloak 登录页面 如注册页面 中实现 recaptcha 我用所需的工厂类扩展了 UsernamePasswordForm 类 我什至还开设了行动要求课程 但我仍然看不到在提供程序选项卡中添加登录 我也修改了现有的logi
  • 如何禁用 C++ 宏中的警告

    在 Visual C 中 您可以使用 pragma 暂时禁用警告 pragma warning suppress 4307 如何禁用宏内的警告 例如 当我导致如下所示的 积分常量溢出 警告时 define TIMES A MILLION x
  • android 旋转器的屏幕方向处理

    我有一个活动 其中有一个旋转器 因为对于纵向和横向模式我有不同的布局所以我正在改变布局onConfigurationChanged method Override public void onConfigurationChanged Con
  • 多个资源的 REST 接口使用

    我目前正在通过 http 添加 REST API 到在线服务 我遇到了一个非常简单的问题 我找不到令我满意的答案 我主要有 2 个资源 用户 和 报告 正如您所猜测的那样 报告与用户相关联 与一个且仅一个 我的数据库中的外键 不管怎样 我有
  • Elastic Search 5.x 嵌套多个查询 C#

    我将 C 与这些 nuget 包一起使用