使用 NEST 的 Elasticsearch - 无结果
Elasticsearch using NEST - No Results
我正在尝试在 Elasticsearch 中进行简单的搜索。
令人惊奇的是,我使用以下查询得到了结果:
GET /gl_search/poc/_search
{
"query": {
"term": {
"Account_No": "056109"
}
}
}
类型是poc,索引是gl_search。见下文
{
"took": 28,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 23586,
"max_score": 4.7722025,
"hits": [
{
"_index": "gl_search",
"_type": "poc",
"_id": "AU7fza_MU2-26YcvKIeM",
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(
node,
defaultIndex: "gl_search"
);
使用 NEST 时,我没有得到任何结果。我尝试了以下方法:
var r = client.Search<poc>(s => s
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
和
var r = client.Search<poc>(query => query.Index("gl_search")
.Type("poc")
.From(0)
.Size(100)
.Filter(x => x.Term(p=> p.Journal_ID, "056109")));
设置为:
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(
node,
defaultIndex: "gl_search"
);
更新
我在 Fiddler 中没有看到任何东西。我想我会在那里看到一些东西。如果是这样,是我设置的方式还是某种病毒防护阻止了它
正如评论中所指出的,在将 SearchDescriptor<T>
序列化到查询 DSL 中时,NEST 默认情况下会驼峰命名 .NET 对象 属性 名称。所以,在你上面的例子中,
void Main()
{
var settings = new ConnectionSettings(new Uri("http://localhost:9200"));
var connection = new InMemoryConnection(settings);
var client = new ElasticClient(connection: connection);
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
);
Console.WriteLine(Encoding.UTF8.GetString(r.RequestInformation.Request));
}
生成以下查询 DSL(注意 属性 是 account_No
)
{
"from": 0,
"size": 10,
"query": {
"term": {
"account_No": {
"value": "056109"
}
}
}
}
现在,有两个真正的选择可以解决这个问题
1.Use 属性 名称的字符串,绕过 NEST 的驼峰式命名约定,但以不使用 lambda 表达式和它们提供的所有类型安全为代价
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term("Account_No", "056109")
)
);
2.Change NEST 的默认序列化选项;如果您的所有属性都按照您的示例进行大小写,则很有用
// change the default camelcase property name serialization
// behaviour with .SetDefaultPropertyNameInferrer
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.SetDefaultPropertyNameInferrer(s => s);
var client = new ElasticClient(settings);
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
);
A Func<string, string>
被传递给 .SetDefaultPropertyNameInferrer()
,它将为每个 属性 调用,将被序列化以形成发送到 Elasticsearch 的 json 查询 DSL。
我正在尝试在 Elasticsearch 中进行简单的搜索。
令人惊奇的是,我使用以下查询得到了结果:
GET /gl_search/poc/_search
{
"query": {
"term": {
"Account_No": "056109"
}
}
}
类型是poc,索引是gl_search。见下文
{
"took": 28,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 23586,
"max_score": 4.7722025,
"hits": [
{
"_index": "gl_search",
"_type": "poc",
"_id": "AU7fza_MU2-26YcvKIeM",
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(
node,
defaultIndex: "gl_search"
);
使用 NEST 时,我没有得到任何结果。我尝试了以下方法:
var r = client.Search<poc>(s => s
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
和
var r = client.Search<poc>(query => query.Index("gl_search")
.Type("poc")
.From(0)
.Size(100)
.Filter(x => x.Term(p=> p.Journal_ID, "056109")));
设置为:
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(
node,
defaultIndex: "gl_search"
);
更新
我在 Fiddler 中没有看到任何东西。我想我会在那里看到一些东西。如果是这样,是我设置的方式还是某种病毒防护阻止了它
正如评论中所指出的,在将 SearchDescriptor<T>
序列化到查询 DSL 中时,NEST 默认情况下会驼峰命名 .NET 对象 属性 名称。所以,在你上面的例子中,
void Main()
{
var settings = new ConnectionSettings(new Uri("http://localhost:9200"));
var connection = new InMemoryConnection(settings);
var client = new ElasticClient(connection: connection);
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
);
Console.WriteLine(Encoding.UTF8.GetString(r.RequestInformation.Request));
}
生成以下查询 DSL(注意 属性 是 account_No
)
{
"from": 0,
"size": 10,
"query": {
"term": {
"account_No": {
"value": "056109"
}
}
}
}
现在,有两个真正的选择可以解决这个问题
1.Use 属性 名称的字符串,绕过 NEST 的驼峰式命名约定,但以不使用 lambda 表达式和它们提供的所有类型安全为代价
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term("Account_No", "056109")
)
);
2.Change NEST 的默认序列化选项;如果您的所有属性都按照您的示例进行大小写,则很有用
// change the default camelcase property name serialization
// behaviour with .SetDefaultPropertyNameInferrer
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.SetDefaultPropertyNameInferrer(s => s);
var client = new ElasticClient(settings);
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term(p => p.Account_No, "056109")
)
);
A Func<string, string>
被传递给 .SetDefaultPropertyNameInferrer()
,它将为每个 属性 调用,将被序列化以形成发送到 Elasticsearch 的 json 查询 DSL。