没有 Nest 的弹性搜索查询

Elastic search querying without Nest

我厌倦了尝试弄清楚如何使用 Nest 以我想要的方式查询我的数据 - 它似乎总是推断出错误的 url 到 post 搜索请求?

无论如何 - 我已经整理了这段看起来很丑但似乎有效的代码:

using (var client = new HttpClient())
            {
                client.BaseAddress = node;
                var content = new StringContent("{\"size\": 0,\"query\": {\"bool\": {\"must\": [{\"wildcard\": {\"FlogDetail.AdditionalInfo.QueryString-filter[slug]\": \"*" + slug +  "*\"}},{\"range\": {\"@timestamp\": {\"gte\": \"now-1d/d\",\"lt\": \"now\"}}}]}},\"aggs\": {\"results\": {\"date_histogram\": {\"field\": \"@timestamp\",\"interval\": \"hour\"}}}}", Encoding.UTF8, "application/json");
                var result = await client.PostAsync(@"usage*/_search", content);
                string resultContent = await result.Content.ReadAsStringAsync();

                JObject o = JObject.Parse(resultContent);

                return o;
            }

现在,在我让它变得更理智和漂亮之前,像这样查询 ES 有什么问题吗?

我使用 Nest 的主要问题是我看不到查询通配符索引的方法,而您可以看到我可以使用普通的旧 C#

如果有人知道最后一点的答案,我将不胜感激!

按照您建议的方式查询 Elasticsearch 没有任何问题。 NEST 支持查询通配符、单个索引、多个索引,例如

var searchResponse = client.Search<MyDocument>(s => s
    .Index("usage*")
    .AllTypes()
    .Query(q => q
        .MatchAll()
    )
);

发送以下请求

POST http://localhost:9200/usage*/_search
{
  "query": {
    "match_all": {}
  }
}

NEST 的约定是将 POCO 映射到索引中的类型,您可以使用 DefaultMappingFor<T>(...) on ConnectionSettings

为给定的 POCO 设置约定
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

var settings = new ConnectionSettings(pool)
    .DefaultMappingFor<MyDocument>(m => m
        .IndexName("usage*")
    );

var client = new ElasticClient(settings);

var searchResponse = client.Search<MyDocument>(s => s
    .AllTypes()
    .Query(q => q
        .MatchAll()
    )
);

然而,对于给定的 POCO,没有指定应省略类型名称的约定,因此在搜索请求中仍然需要调用 .AllTypes() 以搜索匹配 [= 的索引中的所有类型16=].