gpt4 book ai didi

c# - 使用NEST的Elasticsearch-无结果

转载 作者:行者123 更新时间:2023-12-03 02:01:21 25 4
gpt4 key购买 nike

我正在尝试在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.使用字符串作为属性名称,绕过NEST的驼峰约定,但代价是不使用lambda表达式及其提供的所有类型安全性
var r = client.Search<poc>(s => s
.Index("gl_search")
.From(0)
.Size(10)
.Query(q => q
.Term("Account_No", "056109")
)
);

2.更改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")
)
);
Func<string, string>传递给 .SetDefaultPropertyNameInferrer(),将为每个要序列化以形成发送到Elasticsearch的json查询DSL的属性调用。

关于c# - 使用NEST的Elasticsearch-无结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com