繁体   English   中英

如何通过 NEST 基本搜索 Elasticsearch

[英]How to basic search Elasticsearch via NEST

我对 NEST 和 Elasticsearch 非常陌生,但在我的工作场所,他们要求我制作一个 wpf 客户端来从 elasticsearch 搜索和检索文档。

这是存储在 Elastic 中的示例

{
    "_index" : "testing_devices",
    "_type" : "_doc",
    "_id" : "0o6ZeX8BRPRTU2ODedUM",
    "_score" : 1.0,
    "_source" : {
      "timestamp_Local" : "2022-03-11T16:29:34.5763990+01:00",
      "event" : "TestLog",
      "log" : {
        "Guid" : "d8bb9004-7cb1-4594-8c93-80135a8b736c",
        "SerialNumber" : "",
        "RecordType" : 0,
        "Operatore" : "Alessandro",
        "Name" : "03) Configurazione integrato USB FTDI",
        "Result" : 0,
        "StartDate" : "2022-03-11T16:14:42.3746145+01:00",
        "EndDate" : "2022-03-11T16:14:43.6001675+01:00"
      }
    }
  }

POCO

public class Log
{
    public string Guid { get; set; }
    public string SerialNumber { get; set; }
    public int RecordType { get; set; }
    public string Operatore { get; set; }
    public string Name { get; set; }
    public int Result { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

现在我的任务是通过 Guid 搜索文档,所以这是我在客户端应用程序中编写的内容,只是为了测试:

public partial class MainWindow : Window
{
    ElasticClient? client = new ElasticClient();
    ConnectionSettings? settings = new ConnectionSettings(new Uri("https://elk.xyz.to:9200")).DefaultMappingFor<Log>(i=>i.IndexName("testing_devices"))
        .DefaultIndex("testing_devices")
        .ApiKeyAuthentication("xxx", "yyy");

    public MainWindow()
    {
        InitializeComponent();
        client = new ElasticClient(settings);
        var result = client.Search<Log>(s => s.Index("testing_devices").Query(q => q.Match(m => m.Field(f => f.Guid).Query("d8bb9004-7cb1-4594-8c93-80135a8b736c"))));
    }
}

但是我的查询没有结果,它清楚地说零点击,因为我已经读了很多,无法产生任何重要的步骤来实现我的目标,请有人能指出我正确的方向吗?

编辑:我正在添加 INDEX 定义以进行进一步调查:

索引定义粘贴

您的字段Guidlog字段内。 因此,您将无法直接在Guid字段上执行查询,您需要使用字段名称作为log.Guid

下面是 Elasticsearch 的示例查询:

{
  "query": {
    "match": {
      "log.Guid.keyword": "d8bb9004-7cb1-4594-8c93-80135a8b736c"
    }
  }
}

您可以检查以获取 .net 参考,如前所述,您需要使用以下代码。

public MainWindow()
    {
        InitializeComponent();
        client = new ElasticClient(settings);
        var result = client.Search<Log>(s => s.Index("testing_devices").Query(q => q.Match(m => m.Field(f => f.log.Guid.keyword).Query("d8bb9004-7cb1-4594-8c93-80135a8b736c"))));
    }

注意:如果您已将字段定义为textkeyword两种类型(或使用默认映射),那么您可以使用log.Guid.keyword进行精确匹配,否则您需要使用log.Guid但它不会搜索精确匹配,因为它是text类型的字段。

尝试这个:

var result = _client.Search<Log>(s => s.Index("testing_devices").Query(q => q.Match(m => m.Field("log.Guid").Query("d8bb9004-7cb1-4594-8c93-80135a8b736c"))));

这是给我的一击。 您实际上需要搜索 log.Guid 或 log.Guid.keyword。

实际调试时可以检查结果对象中生成的json查询。 查找“DebugInformation”并查看您发送的 json 请求及其响应。 在此处输入图像描述

更新

您无法在结果中的文档列表中获取任何值的原因是因为

首先,由于您的文档结构,您需要在搜索时使用 TestingDevices 类作为 TDocument。

public class TestingDevices
{
    public Log log { get; set; }
}

然后使用以下内容:

var result = _client.Search<TestingDevices>(s => s.Index("testing_devices").Query(q => q.Match(m => m.Field("log.Guid").Query("d8bb9004-7cb1-4594-8c93-80135a8b736c"))));

其次,NEST 库将类中的字段转换为驼峰式。 因此,当您在 Log 类中有“Guid”时,NEST 将在创建搜索查询时将其转换为“guid”,该查询不会出现在索引中。 所有其他领域也是如此。

要么确保你的所有字段在索引中都是骆驼大小写的(如果它们在你的 c# 类中是帕斯卡大小写),或者在创建弹性客户端时使用以下内容。

connectionString.DefaultFieldNameInferrer(prop => prop);
_client = new ElasticClient(connectionString);

当我进行上述两个更改时,我得到了结果集中的文档。

您可以检查的另一件事是 C# 类中字段的数据类型和索引字段类型。

暂无
暂无

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

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