如何使用 C# 中 NEST 客户端的 ElasticClient class 的 Serialize 方法?
How to use the Serialize method from the ElasticClient class from the NEST client in c#?
我已成功创建到 ES 的连接,然后编写了我的 json 查询。现在,我想通过 Serialize 方法发送该查询。
Serialize 方法需要两个参数:
1.对象和
2.流writableStream
我的问题是第二个问题。当我使用以下代码行创建流时:
Stream wstream;
并用它来初始化我的 json2 变量,代码如下:
var json2 = highLevelclient.Serializer.Serialize(query, wstream).Utf8String();
我在 wstream 变量上收到以下错误:
Use of unassigned local variable 'wstream'.
我错过了什么吗?是我创建错误的 wstream 变量的方式吗?谢谢。
/* \\\ 编辑: ///// */
现在还有另一个问题,我使用 Searchblox 来索引和搜索我的文件,它本身调用 ES 2.x 来完成这项工作。 Searchblox 使用“mapping.json”文件在创建索引时初始化映射。这是该文件的 link。
正如“@Russ Cam”所建议的那样,我使用以下代码创建了自己的 class 内容(就像他对“questions”索引和“问题" class):
public class Content
{
public string type { get; set; }
public Fields fields { get; set; }
}
public class Fields
{
public Content1 content { get; set; }
public Autocomplete autocomplete { get; set; }
}
public class Content1
{
public string type { get; set; }
public string store { get; set; }
public string index { get; set; }
public string analyzer { get; set; }
public string include_in_all { get; set; }
public string boost { get; set; }
} //got this with paste special->json class
内容 class中的这些字段(类型、商店等)来自 mapping.json 上面附上的文件。
现在,当我(就像你向我展示的那样)执行以下代码时:
var searchResponse = highLevelclient.Search<Content>(s => s.Query(q => q
.Match(m => m.Field(f => f.fields.content)
.Query("service")
我对 searchResponse 变量的响应是:
Valid NEST response built from a successful low level call on POST: /idx014/content/_search
Audit trail of this API call:
-HealthyResponse: Node: http://localhost:9200/ Took: 00:00:00.7180404
Request:
{"query":{"match":{"fields.content":{"query":"service"}}}}
Response:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
没有 文档在searchResponse.Documents。
矛盾的是,当我在 Searchblox 上搜索 "service" 查询或使用 Google 的 Sense 扩展 API 调用 localhost:9200 Chrome,我得到2个文档。 (我正在寻找的文件)
简而言之,我只想能够:
- 获取所有文件(无条件)
- 获取某个时间范围内的所有文档并基于关键字.. 例如“服务”
我做错了什么?如果需要,我可以提供更多信息。
谢谢大家的详细解答。
您刚刚声明了 wstream
但从未为其分配实际流。根据 Serialize
方法的工作方式,它可能是:
- 您需要创建一个流并将其传递给
Serialize
方法
- 或者您需要传递带有
out
前缀的流参数
这一行
My question is, with the second one. When I create a stream with the following code line:
Stream wstream;
不创建对象。它几乎宣告了它。您需要 new
-编辑它。
Stream wstream = new MemoryStream(); //doesn't have to be MemoryStream here - check what does Serialize expects
记得稍后关闭它或使用using
语句。
using(Stream stream = new MemoryStream())
{
//do operations on wstream
} //closes automatically here
其实用NEST比这个简单多了:) 客户端会帮你序列化你的请求然后发给Elasticsearch,你不需要自己去序列化然后传给客户端发送到 Elasticsearch。
以搜索请求为例。鉴于以下 POCO
public class Question
{
public string Body { get; set; }
}
我们可以搜索正文中包含短语 "this should never happen" 的问题
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.InferMappingFor<Question>(m => m
.IndexName("questions")
);
var client = new ElasticClient(settings);
var searchResponse = client.Search<Question>(s => s
.Query(q => q
.MatchPhrase(m => m
.Field(f => f.Body)
.Query("this should never happen")
)
)
);
// do something with the response
foreach (var question in searchResponse.Documents)
{
Console.WriteLine(question.Body);
}
我已成功创建到 ES 的连接,然后编写了我的 json 查询。现在,我想通过 Serialize 方法发送该查询。 Serialize 方法需要两个参数:
1.对象和 2.流writableStream
我的问题是第二个问题。当我使用以下代码行创建流时:
Stream wstream;
并用它来初始化我的 json2 变量,代码如下:
var json2 = highLevelclient.Serializer.Serialize(query, wstream).Utf8String();
我在 wstream 变量上收到以下错误:
Use of unassigned local variable 'wstream'.
我错过了什么吗?是我创建错误的 wstream 变量的方式吗?谢谢。
/* \\\ 编辑: ///// */ 现在还有另一个问题,我使用 Searchblox 来索引和搜索我的文件,它本身调用 ES 2.x 来完成这项工作。 Searchblox 使用“mapping.json”文件在创建索引时初始化映射。这是该文件的 link。 正如“@Russ Cam”所建议的那样,我使用以下代码创建了自己的 class 内容(就像他对“questions”索引和“问题" class):
public class Content
{
public string type { get; set; }
public Fields fields { get; set; }
}
public class Fields
{
public Content1 content { get; set; }
public Autocomplete autocomplete { get; set; }
}
public class Content1
{
public string type { get; set; }
public string store { get; set; }
public string index { get; set; }
public string analyzer { get; set; }
public string include_in_all { get; set; }
public string boost { get; set; }
} //got this with paste special->json class
内容 class中的这些字段(类型、商店等)来自 mapping.json 上面附上的文件。 现在,当我(就像你向我展示的那样)执行以下代码时:
var searchResponse = highLevelclient.Search<Content>(s => s.Query(q => q
.Match(m => m.Field(f => f.fields.content)
.Query("service")
我对 searchResponse 变量的响应是:
Valid NEST response built from a successful low level call on POST: /idx014/content/_search
Audit trail of this API call:
-HealthyResponse: Node: http://localhost:9200/ Took: 00:00:00.7180404
Request:
{"query":{"match":{"fields.content":{"query":"service"}}}}
Response:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
没有 文档在searchResponse.Documents。 矛盾的是,当我在 Searchblox 上搜索 "service" 查询或使用 Google 的 Sense 扩展 API 调用 localhost:9200 Chrome,我得到2个文档。 (我正在寻找的文件)
简而言之,我只想能够:
- 获取所有文件(无条件)
- 获取某个时间范围内的所有文档并基于关键字.. 例如“服务”
我做错了什么?如果需要,我可以提供更多信息。 谢谢大家的详细解答。
您刚刚声明了 wstream
但从未为其分配实际流。根据 Serialize
方法的工作方式,它可能是:
- 您需要创建一个流并将其传递给
Serialize
方法 - 或者您需要传递带有
out
前缀的流参数
这一行
My question is, with the second one. When I create a stream with the following code line:
Stream wstream;
不创建对象。它几乎宣告了它。您需要 new
-编辑它。
Stream wstream = new MemoryStream(); //doesn't have to be MemoryStream here - check what does Serialize expects
记得稍后关闭它或使用using
语句。
using(Stream stream = new MemoryStream())
{
//do operations on wstream
} //closes automatically here
其实用NEST比这个简单多了:) 客户端会帮你序列化你的请求然后发给Elasticsearch,你不需要自己去序列化然后传给客户端发送到 Elasticsearch。
以搜索请求为例。鉴于以下 POCO
public class Question
{
public string Body { get; set; }
}
我们可以搜索正文中包含短语 "this should never happen" 的问题
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.InferMappingFor<Question>(m => m
.IndexName("questions")
);
var client = new ElasticClient(settings);
var searchResponse = client.Search<Question>(s => s
.Query(q => q
.MatchPhrase(m => m
.Field(f => f.Body)
.Query("this should never happen")
)
)
);
// do something with the response
foreach (var question in searchResponse.Documents)
{
Console.WriteLine(question.Body);
}