默认情况下,nest通过一个称为
Conditionless queries
是的。你可以
private static void Main()
{
var defaultIndex = "documents";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool, new InMemoryConnection())
.DefaultIndex(defaultIndex)
.DisableDirectStreaming()
.PrettyJson()
.OnRequestCompleted(callDetails =>
{
if (callDetails.RequestBodyInBytes != null)
{
Console.WriteLine(
$"{callDetails.HttpMethod} {callDetails.Uri} \n" +
$"{Encoding.UTF8.GetString(callDetails.RequestBodyInBytes)}");
}
else
{
Console.WriteLine($"{callDetails.HttpMethod} {callDetails.Uri}");
}
Console.WriteLine();
if (callDetails.ResponseBodyInBytes != null)
{
Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
$"{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n" +
$"{new string('-', 30)}\n");
}
else
{
Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
$"{new string('-', 30)}\n");
}
});
var client = new ElasticClient(settings);
var pageSize = 20;
var currentPageIndex = 0;
string search = "foo";
var searchResponse = client.Search<DocumentElasticModel>(s => s
.Size(pageSize)
.Skip(currentPageIndex * pageSize)
.Sort(ss => ss
.Descending(SortSpecialField.Score)
)
.Source(sf => sf
.Includes(i => i
.Fields(f => f.TopLevelMessage)
)
)
.Query(q => q
.Nested(c => c
.Name("named_query")
.Boost(1.1)
.InnerHits(i => i.Explain())
.Path(p => p.PerguntasRespostas)
.Query(nq => nq
.MultiMatch(m => m
.Fields(f => f
.Field(ff => ff.PerguntasRespostas.First().Message)
)
.Query(search)
)
)
.IgnoreUnmapped()
)
)
);
}
public class DocumentElasticModel
{
public string TopLevelMessage { get; set; }
public IEnumerable<PerguntasRespostas> PerguntasRespostas {get;set;}
}
public class PerguntasRespostas
{
public string Message { get; set; }
}
这将发送以下查询
POST http://localhost:9200/documents/documentelasticmodel/_search
{
"from": 0,
"size": 20,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"topLevelMessage"
]
},
"query": {
"nested": {
"_name": "named_query",
"boost": 1.1,
"query": {
"multi_match": {
"query": "foo",
"fields": [
"perguntasRespostas.message"
]
}
},
"path": "perguntasRespostas",
"inner_hits": {
"explain": true
},
"ignore_unmapped": true
}
}
}
现在,如果你改变
search
到
string.Empty
或
null
,你得到
POST http://localhost:9200/documents/documentelasticmodel/_search
{
"from": 0,
"size": 20,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"topLevelMessage"
]
}
}
没有明确的
"query"
在请求中,这与
match_all
查询。
如果要重写嵌套中的无条件查询功能,可以将查询标记为
.Verbatim()
Nest会按原样发送
var searchResponse = client.Search<DocumentElasticModel>(s => s
.Size(pageSize)
.Skip(currentPageIndex * pageSize)
.Sort(ss => ss
.Descending(SortSpecialField.Score)
)
.Source(sf => sf
.Includes(i => i
.Fields(f => f.TopLevelMessage)
)
)
.Query(q => q
.Nested(c => c
.Verbatim() // <-- mark the nested query
.Name("named_query")
.Boost(1.1)
.InnerHits(i => i.Explain())
.Path(p => p.PerguntasRespostas)
.Query(nq => nq
.MultiMatch(m => m
.Verbatim() // <-- mark the inner query
.Fields(f => f
.Field(ff => ff.PerguntasRespostas.First().Message)
)
.Query(search)
)
)
.IgnoreUnmapped()
)
)
);
它发出
POST http://localhost:9200/documents/documentelasticmodel/_search
{
"from": 0,
"size": 20,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"topLevelMessage"
]
},
"query": {
"nested": {
"_name": "named_query",
"boost": 1.1,
"query": {
"multi_match": {
"fields": [
"perguntasRespostas.message"
]
}
},
"path": "perguntasRespostas",
"inner_hits": {
"explain": true
},
"ignore_unmapped": true
}
}
}
您需要检查这是否是ElasticSearch接受的有效查询。