NEST returns null 而不是字段
NEST returns null instead of fields
我使用 elastic 已经很长时间了,但是我从来没有写过获取一些数据的代码。现在我有麻烦了。
我有一个索引,我想在其中检索投影在某个字段上的一些文档。我可以直接写成 SQL
SELECT myDocumentField
FROM myIndex
但出于某种原因,我得到的是空值而不是值。
我的索引中有 6 个文档。所以我写了以下查询:
var elasticServiceNumbers = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.Query(Selector));
它按预期工作 return 这 6 个值,除了它们的所有字段都是 null
好的,我也在尝试添加字段:
var elasticServiceNumbers = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.StoredFields(sf => sf.Fields(f => f.ServiceNumber))
.Query(Selector));
var elasticServiceNumbers2 = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.Source(sf => sf.Includes(fds => fds.Field(f => f.ServiceNumber)))
.Query(Selector));
但仍然不走运,字段保持空值。
Kibana 显示该字段存在于索引中:
这里可能有什么问题?
Kibana查询
{
"version": true,
"size": 500,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"excludes": []
},
"aggs": {
"2": {
"date_histogram": {
"field": "@timestamp",
"interval": "3h",
"time_zone": "Asia/Baghdad",
"min_doc_count": 1
}
}
},
"stored_fields": [
"*"
],
"script_fields": {},
"docvalue_fields": [
"@timestamp",
"fields.Date",
"fields.DeserializedMessage.Message.Date",
"fields.DeserializedMessage.Message.Periods.Begin",
"fields.DeserializedMessage.Message.Periods.End",
"fields.DeserializedMessage.Message.ResponseDate",
"fields.Periods.Begin",
"fields.Periods.End",
"fields.ResponseDate"
],
"query": {
"bool": {
"must": [
{
"match_all": {}
},
{
"range": {
"@timestamp": {
"gte": 1527973200000,
"lte": 1528577999999,
"format": "epoch_millis"
}
}
}
],
"filter": [],
"should": [],
"must_not": []
}
},
"highlight": {
"pre_tags": [
"@kibana-highlighted-field@"
],
"post_tags": [
"@/kibana-highlighted-field@"
],
"fields": {
"*": {}
},
"fragment_size": 2147483647
}
}
字段是否标记为已存储?我看到它们已被索引(可搜索)。
如果没有任何查询就尝试怎么样?
var r = await _elasticClient.SearchAsync<ElasticRequest>(s=>s.From(0).Size(10));
看起来有问题的字段是 doc value fields ,因为它们是可搜索和聚合的,但不是 存储的 ,即发送的原始 _source
文档未存储到 Elasticsearch。
使用 NEST 获取文档值字段
var searchResponse = client.Search<ElasticRequest>(s => s
.DocValueFields(f => f
.Field(ff => ff.ServiceNumber.Suffix("keyword"))
)
);
这是使用 serviceNumber
的 keyword
映射,它看起来是一个文档值字段。
我使用 elastic 已经很长时间了,但是我从来没有写过获取一些数据的代码。现在我有麻烦了。
我有一个索引,我想在其中检索投影在某个字段上的一些文档。我可以直接写成 SQL
SELECT myDocumentField
FROM myIndex
但出于某种原因,我得到的是空值而不是值。
我的索引中有 6 个文档。所以我写了以下查询:
var elasticServiceNumbers = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.Query(Selector));
它按预期工作 return 这 6 个值,除了它们的所有字段都是 null
好的,我也在尝试添加字段:
var elasticServiceNumbers = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.StoredFields(sf => sf.Fields(f => f.ServiceNumber))
.Query(Selector));
var elasticServiceNumbers2 = await _elasticClient.SearchAsync<ElasticRequest>(
s => s.Source(sf => sf.Includes(fds => fds.Field(f => f.ServiceNumber)))
.Query(Selector));
但仍然不走运,字段保持空值。
Kibana 显示该字段存在于索引中:
这里可能有什么问题?
Kibana查询
{
"version": true,
"size": 500,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"excludes": []
},
"aggs": {
"2": {
"date_histogram": {
"field": "@timestamp",
"interval": "3h",
"time_zone": "Asia/Baghdad",
"min_doc_count": 1
}
}
},
"stored_fields": [
"*"
],
"script_fields": {},
"docvalue_fields": [
"@timestamp",
"fields.Date",
"fields.DeserializedMessage.Message.Date",
"fields.DeserializedMessage.Message.Periods.Begin",
"fields.DeserializedMessage.Message.Periods.End",
"fields.DeserializedMessage.Message.ResponseDate",
"fields.Periods.Begin",
"fields.Periods.End",
"fields.ResponseDate"
],
"query": {
"bool": {
"must": [
{
"match_all": {}
},
{
"range": {
"@timestamp": {
"gte": 1527973200000,
"lte": 1528577999999,
"format": "epoch_millis"
}
}
}
],
"filter": [],
"should": [],
"must_not": []
}
},
"highlight": {
"pre_tags": [
"@kibana-highlighted-field@"
],
"post_tags": [
"@/kibana-highlighted-field@"
],
"fields": {
"*": {}
},
"fragment_size": 2147483647
}
}
字段是否标记为已存储?我看到它们已被索引(可搜索)。
如果没有任何查询就尝试怎么样?
var r = await _elasticClient.SearchAsync<ElasticRequest>(s=>s.From(0).Size(10));
看起来有问题的字段是 doc value fields ,因为它们是可搜索和聚合的,但不是 存储的 ,即发送的原始 _source
文档未存储到 Elasticsearch。
使用 NEST 获取文档值字段
var searchResponse = client.Search<ElasticRequest>(s => s
.DocValueFields(f => f
.Field(ff => ff.ServiceNumber.Suffix("keyword"))
)
);
这是使用 serviceNumber
的 keyword
映射,它看起来是一个文档值字段。