[英]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 定义以进行进一步调查:
您的字段Guid
在log
字段内。 因此,您将无法直接在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"))));
}
注意:如果您已将字段定义为text
和keyword
两种类型(或使用默认映射),那么您可以使用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.