C# 嵌套-低级别搜索不';返回日期
我有一个C#控制台应用程序,我使用NEST索引数据并在ElasticSearch中搜索 版本:C# 嵌套-低级别搜索不';返回日期,c#,elasticsearch,nest,C#,elasticsearch,Nest,我有一个C#控制台应用程序,我使用NEST索引数据并在ElasticSearch中搜索 版本: ElasticSearch 7.5.2 .NET 4.7.2 NEST 7.6.1 当我使用NEST进行搜索时,一切都正常。但在某些特殊情况下,我希望使用NEST的低级搜索(因为我可以使用sql命令)。但在低层搜索中并没有得到时间戳。下面是代码示例: class EsObject { public int Id { get; set; } public string Name {
- ElasticSearch 7.5.2
- .NET 4.7.2
- NEST 7.6.1
class EsObject
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Timestamp { get; set; }
public override string ToString()
{
return $"Id = {Id}, Name = {Name}, Timestamp = {Timestamp.ToString("dd.MM.yyyy HH:mm:ss")}";
}
}
class Program
{
static void Main(string[] args)
{
var indexName = "es_objects";
//
// Create data objects
//
var obj = new EsObject()
{
Id = 1,
Name = "Object_1",
Timestamp = new DateTime(2020, 2, 12, 4, 55, 19)
};
Console.WriteLine($"Object created {obj}");
//
// Connect to ElasticSearch
//
Console.Write("Connecting to ElasticSearch... ");
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node)
.DefaultIndex(indexName)
.DefaultMappingFor<EsObject>(x => x.IdProperty("Id"))
.DefaultFieldNameInferrer(s => s.ToLower()); ;
var esClient = new ElasticClient(settings);
Console.WriteLine("done");
//
// Index data
//
Console.Write("Indexing data... ");
var idxResp = esClient.IndexDocument(obj);
Console.WriteLine("done");
//
// Searching using NEST
//
Console.Write("Searching data using NEST ... ");
var result = esClient.Search<EsObject>(s => s
.Query(q => q
.Match(m => m
.Field(f => f.Name)
.Query(obj.Name))))
.Documents
.ToList();
Console.WriteLine("done");
Console.WriteLine($"Results: found {result.Count} items");
if (result.Count > 0)
Console.WriteLine($"Found item: {result[0]}");
//
// Searching using SQL
//
Console.Write("Searching data using low level ... ");
var request = new TranslateSqlRequest
{
Query = $"select * from {indexName} where name='{obj.Name}'"
};
var sqlResponse = esClient.LowLevel.Sql.Translate<StringResponse>(PostData.Serializable(request));
var resp = esClient.LowLevel.Search<SearchResponse<EsObject>>(indexName, sqlResponse.Body).Documents.ToList();
Console.WriteLine("done");
Console.WriteLine($"Results: found {resp.Count} items");
if (resp.Count > 0)
Console.WriteLine($"Found item: {resp[0]}");
Console.ReadKey();
}
}
知道如何在使用低级搜索时获得正确的日期值吗?SQL Translate API生成的查询如下所示
{
"size" : 1000,
"query" : {
"term" : {
"name.keyword" : {
"value" : "Object_1",
"boost" : 1.0
}
}
},
"_source" : {
"includes" : [
"name"
],
"excludes" : [ ]
},
"docvalue_fields" : [
{
"field" : "id"
},
{
"field" : "timestamp",
"format" : "epoch_millis"
}
],
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}
关键的是,执行源筛选仅返回\u source
文档中的name
字段,其中id
和timestamp
从docvalue\u字段返回。要从搜索响应中获取这些内容,您需要为每次点击从字段中获取它们
var resp=client.LowLevel.Search(indexName,sqlResponse.Body);
var文档=相应的点击次数
.选择(h=>{
h、 Source.Id=h.Fields.ValueOf(f=>f.Id);
h、 Source.Timestamp=DateTimeOffset.fromUnixtimeMissions(long.Parse(h.Fields.Value(“Timestamp”))).DateTime;
返回h.源;
})
.ToList();
以下是搜索响应JSON供参考
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "es_objects",
"_type" : "_doc",
"_id" : "1",
"_score" : null,
"_source" : {
"name" : "Object_1"
},
"fields" : {
"id" : [
1
],
"timestamp" : [
"1581483319000"
]
},
"sort" : [
0
]
}
]
}
}
一个搜索查询,可以满足您的需要
var resp=client.Search(s=>s
.Query(q=>q
.Term(f=>f.Name.Suffix(“关键字”),obj.Name)
)
.Sort(s=>s.升序(SortSpecialField.DocumentIndexOrder))
);
var documents=resp.documents.ToList();
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "es_objects",
"_type" : "_doc",
"_id" : "1",
"_score" : null,
"_source" : {
"name" : "Object_1"
},
"fields" : {
"id" : [
1
],
"timestamp" : [
"1581483319000"
]
},
"sort" : [
0
]
}
]
}
}