简体   繁体   English

如何在.net nest中更新现有已过滤的Elasticsearch查询

[英]How to update existing filtered elasticsearch query in .net nest

I've a json query coming from gui. 我有一个来自gui的json查询。 It has filtered query parts in it. 它已经过滤了查询部分。 I want to extend filtered query with date range filter How can I do that using nest. 我想使用日期范围过滤器扩展过滤的查询。如何使用嵌套。 I tried a method (QueryTest method) like below, but failed. 我尝试了以下方法(QueryTest方法),但失败了。

public SearchDescriptor<dynamic> GetSearchDescriptor(string queryJson = null)
    {
        var searchDesc = new SearchDescriptor<dynamic>();

        if (string.IsNullOrEmpty(queryJson))
        {
            return searchDesc;
        }

        searchDesc = _nestClient.Serializer.Deserialize<SearchDescriptor<dynamic>>(new MemoryStream(Encoding.UTF8.GetBytes(queryJson)));

        return searchDesc;
    }

public string ConvertToJsonQuery(SearchDescriptor<dynamic> searchDescriptor)
    {
        return Encoding.UTF8.GetString(_nestClient.Serializer.Serialize(searchDescriptor, SerializationFormatting.Indented));
    }

public void QueryTest()
    {
        var query = @"{     
                        ""query"": {
                        ""filtered"": {
                            ""filter"": {
                            ""bool"": {
                                ""must"": [
                                {
                                    ""term"": {
                                    ""display_name"": ""NBLEYLEK$""
                                    }
                                }
                                ]
                            }
                            }
                        }
                        }
                    }";

        var searchDescriptor = GetSearchDescriptor(query).AllTypes(); 

        var queryLastA = ConvertToJsonQuery(searchDescriptor);

        searchDescriptor.Query(x => x.Filtered(y => y.Filter(z => z.Range(t => t.OnField("sign_time").Greater(DateTime.Now)))));

        var queryLastB = ConvertToJsonQuery(searchDescriptor);
    }

If I look at values of queryLastA and queryLastB, I see as: 如果查看queryLastA和queryLastB的值,我将看到:

queryLastA => queryLastA =>

{      
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "display_name": "NBLEYLEK$"
              }
            }
          ]
        }
      }
    }
  }
}

queryLastB => queryLastB =>

{
  "query": {
    "filtered": {
      "filter": {
        "range": {
          "sign_time": {
            "gt": "2015-08-25T16:13:56.694"
          }
        }
      }
    }
  }
}

The desired query is : 所需的查询是:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "display_name": "NBLEYLEK$"
              }
            },
            {
              "range": {
                "sign_time": {
                  "gt": "2015-08-25T16:13:56.694"
                }
              }
            }
          ]
        }
      }
    }
  }
}

I expect from nest to append new filter under old one, but it ignores old filter (compare queryLastB with queryLastA). 我希望从嵌套中在旧过滤器下追加新过滤器,但它会忽略旧过滤器(将queryLastB与queryLastA比较)。 Any advice ? 有什么建议吗?

Currently in nest if we give new filter, it overrides the old filter. 当前在嵌套中,如果我们提供新的过滤器,它将覆盖旧的过滤器。 I had the same problem. 我有同样的问题。 I did string operations on query and converted it into c# class and applied filter from scratch using nest. 我对查询进行了字符串操作,并将其转换为c#类,并使用nest从头开始应用了过滤器。 This worked out for me. 这为我解决了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM