elasticsearch,nest,C#,.net,String,elasticsearch,Nest" /> elasticsearch,nest,C#,.net,String,elasticsearch,Nest" />

C# 为什么ElasticSearch嵌套查询中会出现转义反斜杠?

C# 为什么ElasticSearch嵌套查询中会出现转义反斜杠?,c#,.net,string,elasticsearch,nest,C#,.net,String,elasticsearch,Nest,我正在尝试编写一个C#方法,获取控制器的queryString,并将其转换为ElasticSearch查询,如下所示: public QueryContainerDescriptor<T> Convert<T> (IQueryCollection query) where T: class { var selector = new QueryContainerDescriptor<T>(); List<QueryContainer>

我正在尝试编写一个C#方法,获取控制器的
queryString
,并将其转换为ElasticSearch查询,如下所示:

public QueryContainerDescriptor<T> Convert<T> (IQueryCollection query) where T: class
{
    var selector = new QueryContainerDescriptor<T>();
    List<QueryContainer> Must = new List<QueryContainer>();
    foreach(var key in query.keys)
    {
        string value = query[key];
        var match = new MatchQuery { Field = $"{key}.keyword", Query = value };
        list.Add(match)
    }
    selector.Bool(q => q.Must(Must.ToArray()));
    return selector;
}
应将其转换为此查询:

{ "bool": { "must": [ { "match" : { "user.keyword": "ESKA\\USER" } } ] }
但是ElasticSearch将不返回任何内容,因为查询的值将是:
ESKA\\\\USER
,带有4个反斜杠,如:

{ "bool": { "must": [ { "match" : { "user.keyword": "ESKA\\\\USER" } } ] }

如何解决这个问题?

我认为Nest没有执行任何反斜杠的转义。下面是一个写出请求(和响应的示例,如果使用发送请求的
IConnection

private static void Main()
{
变量池=新的SingleNodeConnectionPool(新Uri($)http://localhost:9200"));
var设置=新连接设置(池,新InMemoryConnection())
.DefaultIndex(“默认索引”)
.DisableDirectStreaming()
.PrettyJson()
.OnRequestCompleted(callDetails=>
{
if(callDetails.RequestBodyInBytes!=null)
{
var json=JObject.Parse(Encoding.UTF8.GetString(callDetails.RequestBodyInBytes));
控制台写入线(
$“{callDetails.HttpMethod}{callDetails.Uri}\n”+
$“{json.ToString(Newtonsoft.json.Formatting.Indented)}”;
}
其他的
{
WriteLine($“{callDetails.HttpMethod}{callDetails.Uri}”);
}
Console.WriteLine();
if(callDetails.ResponseBodyInBytes!=null)
{
Console.WriteLine($“状态:{callDetails.HttpStatusCode}\n”+
$“{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n”+
$“{新字符串('-',30)}\n”);
}
其他的
{
Console.WriteLine($“状态:{callDetails.HttpStatusCode}\n”+
$“{新字符串('-',30)}\n”);
}
});
var客户端=新的ElasticClient(设置);
var collection=newquerycollection(新字典
{
{“用户”,“ESKA\\user”}
});
var response=client.Search(s=>s
.Query(q=>Convert(q,collection))
);
}
公共静态QueryContainerDescriptor转换(QueryContainerDescriptor选择器,IQueryCollection查询),其中T:class
{
列表必须=新列表();
foreach(query.Keys中的var键)
{
字符串值=查询[键];
var match=newmatchquery{Field=$“{key}.keyword”,Query=value};
必须。添加(匹配);
}
selector.Bool(q=>q.Must(Must.ToArray());
返回选择器;
}
生成的查询是

POSThttp://localhost:9200/default_index/_search?pretty=true&typed_keys=true 
{
“查询”:{
“布尔”:{
“必须”:[
{
“匹配”:{
“user.keyword”:{
“查询”:“ESKA\\USER”
}
}
}
]
}
}
}
如果
user
值是
@“ESKA\\user”
,则生成的查询将是

“user.keyword”:{
“查询”:“ESKA\\\\USER”
}
因为逐字字符串文本中的每个
\
都需要转义

{ "bool": { "must": [ { "match" : { "user.keyword": "ESKA\\\\USER" } } ] }