没有 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=].
我厌倦了尝试弄清楚如何使用 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
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=].