繁体   English   中英

没有Nest的弹性搜索查询

[英]Elastic search querying without Nest

我已经厌倦了尝试找出如何使用Nest进行查询的方式-似乎总是会推断出错误的网址以将搜索请求发布到?

无论如何-我整理了看起来很丑陋的代码,似乎很有效:

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映射到索引内的类型,您可以使用ConnectionSettings上的DefaultMappingFor<T>(...)为给定的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()的调用,以在与usage*匹配的索引中搜索所有类型usage*

暂无
暂无

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

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