我是点网核心的新手。我正在使用https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/nest.html作为弹性搜索客户端。
我对弹性搜索中的书面查询有以下查询:
{
"query": {
"bool":{
"must":[
{
"term":{
"bookId.keyword":"c962ec04-6d25-4823-8e78-6d99d4072032"
}
},
{
"bool":{
"should":[
{
"match_phrase":{
"text":"Plants"
}
}
]
}
}
]
}
}
}
虽然我的NEST代码是:
var searchResponse = await _esClient.SearchAsync<Content>(s => s
.Query(q => q
.Bool(b => b
.Must(m => m
.Term(terms => terms.Field(
field => field.BookId.Suffix("keyword")
).Value(bookId.ToString())
)
)
.Must(should =>
should.Match(mp => mp.Field(f => f.Text).Query(query))
)
)
));
但是我无法获得预期的结果。有人可以帮我吗?
您的NEST查询与DSL查询不完全匹配。请修改您的查询以符合以下条件。
var searchResponse = await _esClient.SearchAsync<Content>(s => s
.Query(q => q
.Bool(b => b
.Must(m => m
.Term(terms => terms
.Field(field => field
.BookId.Suffix("keyword"))
.Value(bookId.ToString())
) && m.Bool(mb => mb
.Should(sh => sh
.MatchPhrase(mp => mp
.Field(f => f.Text).Query(query))))
)
)
));
您几乎知道了。 Must()
接受查询params[]
,而不是多次调用
var searchResponse = await _esClient.Search<Content>(s => s
.Query(q => q
.Bool(b => b
.Must(m => m
.Term(terms => terms.Field(
field => field.BookId.Suffix("keyword")
).Value(bookId.ToString())
), m => m
.Bool(mb => mb
.Should(sh => sh
.MatchPhrase(mp => mp
.Field(f => f.Text)
.Query(query)
)
)
)
)
)
)
);
Mahesh's answer是使用操作符重载编写此查询的更简洁的方法。