- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试访问hits _source词典以加载到数据库中。
hits返回null,我在做什么错?
笔记:
searchResponse与JSON数据一起返回,并且调试信息对其进行确认。
但是,不可访问Hit和_Source类以及基础数据变量,并且变量hit将返回null。
下面的 Debug模式下的局部变量代码显示了数据。
如果需要的话,我可以提供更多数据或局部变量的图像或调试信息窗口(如果这有助于解决问题)。
提前致谢。
尝试使用searchResponse.Documents和foreach语句访问_source键值对以访问匹配中的元素。但是无法访问_source键值对。
/*Declared classes in visual studio console application for c#:
.NET framework 4.5*/
class Program
{
public class Doc
{
public int took { get; set; }
public bool timed_out { get; set; }
public _Shards _shards { get; set; }
public Hits hits { get; set; }
}
public class _Shards
{
public int total { get; set; }
public int successful { get; set; }
public int skipped { get; set; }
public int failed { get; set; }
}
public class Hits
{
public int total { get; set; }
public float max_score { get; set; }
public Hit[] hits { get; set; }
}
public class Hit
{
public string _index { get; set; }
public string _type { get; set; }
public string _id { get; set; }
public float _score { get; set; }
public _Source _source { get; set; }
}
public class _Source
{
public int duration { get; set; }
public string group_id { get; set; }
public DateTime var_time { get; set; }
public string var_name { get; set; }
}
static void Main(string[] args)
{
var uri = new Uri("http://domain_name.val.url:9203/");
var pool = new SingleNodeConnectionPool(uri);
var connectionSettings = new ConnectionSettings(pool)
.DisableDirectStreaming();
var resolver = new IndexNameResolver(connectionSettings);
var client = new ElasticClient(connectionSettings);
if (!client.IndexExists("test_index").Exists)
{
client.CreateIndex("test_index");
}
var searchResponse = client.Search<Doc>(s => s
.Index("test_index")
.AllTypes()
.Size(1)
.Query(q => q
.MatchAll())
.TypedKeys(null)
.SearchType(Elasticsearch.Net.SearchType.DfsQueryThenFetch)
.Scroll("30s")
);
MessageBox.Show("searchResponse.DebugInformation=" + searchResponse.DebugInformation);
}
}
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2700881,
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index",
"_type" : "doc",
"_id" : "R22224!!5333e7e4-9ee3-45f4-9dc3-2a8b8d8cdcf8",
"_score" : 1.0,
"_source" : {
"duration" : 14986283,
"group_id" : "com",
"var_time" : "2018-04-24T17:05:13.082+02:00",
"var_name" : "2",
}
}
]
}
}
var searchResponse = client.Search<Doc>(s => s
.Index("test_index")
.AllTypes()
.Size(10)
.Query(q => q
.MatchAll())
.TypedKeys(null)
.SearchType(Elasticsearch.Net.SearchType.DfsQueryThenFetch)
.Scroll("30s")
.RequestConfiguration(r=>r
.DisableDirectStreaming()
)
);
var raw = Encoding.UTF8.GetString(searchResponse.ApiCall.ResponseBodyInBytes);
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.MaxJsonLength = Int32.MaxValue;
var pairs = jss.Deserialize<Dictionary<string, dynamic>>(raw);
最佳答案
看来您误解了客户端的API。您不需要声明_Shards
,Hit
,Hits
,_Source
等。客户端会为您代劳反序列化Elasticsearch API的这些部分。
您需要定义的唯一部分是POCO,它将映射到响应中每个"_source"
字段中的JSON对象,即
{
"duration" : 14986283,
"group_id" : "com",
"var_time" : "2018-04-24T17:05:13.082+02:00",
"var_name" : "2",
}
_Source
POCO一样(尽管我倾向于给它起一个更有意义的名字!)。现在暂时将其称为
MyDocument
。
MyDocument
定义为
public class MyDocument
{
[PropertyName("duration")]
public int Duration { get; set; }
[PropertyName("group_id")]
public string GroupId { get; set; }
[PropertyName("var_time")]
public DateTime Time { get; set; }
[PropertyName("var_name")]
public string Name { get; set; }
}
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultMappingFor<MyDocument>(m => m
.IndexName("test_index")
.TypeName("doc")
);
var client = new ElasticClient(settings);
var searchResponse = client.Search<MyDocument>();
// A collection of the top 10 matching documents
var documents = searchResponse.Documents;
DefaultMappingFor<MyDocument>(...)
且未在请求中明确定义它们时,
"test_index"
将使用索引名称
doc
和类型名称“
MyDocument
”。
POST http://localhost:9200/test_index/doc/_search
{}
var searchResponse = client.Search<MyDocument>(s => s
.Size(1000)
.Scroll("30s")
);
while (searchResponse.Documents.Any())
{
foreach (var document in searchResponse.Documents)
{
// do something with this set of 1000 documents
}
// make an additional request
searchResponse = client.Scroll<MyDocument>("30s", searchResponse.ScrollId);
}
// clear scroll id at the end
var clearScrollResponse = client.ClearScroll(c => c.ScrollId(searchResponse.ScrollId));
ScrollAll
可观察的助手,您可以使用它来简化编写工作,并使用
parallelizes the operation using sliced_scroll
。与上述相同的操作,但使用
ScrollAll
// set to number of shards in targeted indices
var numberOfSlices = 4;
var scrollAllObservable = client.ScrollAll<MyDocument>("30s", numberOfSlices);
Exception exception = null;
var manualResetEvent = new ManualResetEvent(false);
var scrollAllObserver = new ScrollAllObserver<MyDocument>(
onNext: s =>
{
var documents = s.SearchResponse.Documents;
foreach (var document in documents)
{
// do something with this set of documents
}
},
onError: e =>
{
exception = e;
manualResetEvent.Set();
},
onCompleted: () => manualResetEvent.Set()
);
scrollAllObservable.Subscribe(scrollAllObserver);
manualResetEvent.WaitOne();
if (exception != null)
throw exception;
var numberOfSlices = 4;
var scrollAllObservable = client.ScrollAll<MyDocument>("30s", numberOfSlices)
.Wait(TimeSpan.FromHours(2), onNext: s =>
{
var documents = s.SearchResponse.Documents;
foreach (var document in documents)
{
// do something with this set of documents
}
});
关于c# - 无法从弹性客户端搜索响应中获取_source字典键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54151146/
禁用 _source 的确切后果是什么? Elasticsearch 映射中的字段? 令人惊讶的简短documentation在 _source字段本身只是声明 Though very handy t
我正在向 http://localhost:9200/movie_db/movie/_search 发布查询,但 _source 属性在返回结果中始终为空。我启用了它,但这没有用。 电影数据库: TR
使用 Elasticsearch 1.4.3 我正在构建一种“报告”系统。客户可以挑选他们想要在结果中返回的字段。 在 90% 的情况下,客户端永远不会选择所有字段,所以我想我可以在映射中禁用 _so
我在 Elasticsearch 中有以下格式的记录: { "_index" : "feb14", "_type" : "apache_access", "_id
我正在尝试为Elasticsearch 6.7创建映射,但是当我获得记录时,除非启用_source,否则我看不到任何映射的字段。 我有以下示例: PUT xyz { "mappings":{
我在elastic-search 5中有一个文档,如下 { "_index": "my_index", "_type": "json", "_id": "document_id", "
"_source": { "id": "5b1676493d21784208c36041", "label": "name", "properti
我正在探索 ElasticSearch,用于应用程序,它将处理大量数据并生成一些统计结果。我的要求是检索特定字段的某些统计信息。例如,对于给定的字段,我想检索其唯一值和每个值的文档频率,以及值的长度。
当我使用(官方)nodejs-elasticsearch 库执行搜索查询时,是否可以仅检索 _source 文档?根据文档,似乎有一种方法: Use the /{index}/{type}/{id}/
我是elasticsearch的新手,我正在做一个匹配所有查询,它以这种方式检索数据,但只有我想要在_source中检索数据,我该怎么做?有什么想法吗? { "took": 4, "t
当输入JSON具有“_source”字段时,则输出JSON没有针对搜索的输出。 有两种情况。 情况_1:输入JSON确实具有“_source”字段,并且输出为Null 情况_2:输入JSON没有“_s
我需要实现一个搜索引擎。像谷歌/雅虎搜索一样,在搜索组件中,如果输入任何键,它应该找到匹配项并显示。为此,我创建了与 Elasticsearch 集成的 Spring Boot 项目。 我使用 log
我有一个正在尝试解决的性能问题...我正在从 AWS 托管 Elasticsearch 6.2 中的源索引到目标索引进行即时重新索引。源索引目前大小为数百 GB,并且在生产中可能会更大。因此,重新索引
我尝试对包含自定义脚本函数的 ElasticSearch (6.4.0) API 执行搜索请求。在这个函数中,我尝试访问一个数组,它应该是响应数据的一部分。但我总是得到一个“null_pointer_
我在索引文档的 _source 中有很多字段。但是,我不需要将所有这些都从搜索查询中返回。现在,对于每个找到的文档,都会返回整个 _source。我如何才能强制只接收每个 _source 的特定字段?
我有以下映射 { "cloth": { "dynamic" : false, "_source" : {"enabled"
我仅通过几个字段进行搜索,但我希望能够将整个文档存储在 ES 中,以免进行额外的 DB (MySQL) 查询。 我尝试将 index: no、store: no 添加到映射中的整个对象/属性,但我仍然
问题 如题:elasticsearch 从 _source 与 stored_fields 获取数据不一致? 大伙都知道,使用 elasticsearch 进行数据存储的时候,查询数据会默认存储在_s
在某些情况下会很好(我有固定数量的字段可显示在搜索结果上,并创建逻辑来替换“突出显示”集合中的一个字段,而第二个字段则保留原始字段在某种程度上令人不舒服)。可能吗? "hits": [ {
只是想知道。 是否可以在 _source = false 的索引上突出显示 ElasticSearch 中的文本? 我的意思是我知道如果 ES 没有他不能做高亮的文档,但是有没有办法只使用 ES 作为
我是一名优秀的程序员,十分优秀!