Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套-低级别搜索不';返回日期_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 嵌套-低级别搜索不';返回日期

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 {

我有一个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 { 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
        ]
      }
    ]
  }
}