多个 should 查询与 must 查询
Multiple should queries with must query
我正在构建对 Elastic 5 的查询(使用 .net 中的嵌套),我正在尝试实现此结果:
必须有值 1 和值 2
应该有值 3 或值 4
并且应该有 value5 或 value6
这是我的查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"code": {
"query": "value1"
}
}
},
{
"match": {
"code": {
"query": "value2"
}
}
}
],
"should": [
{
"match": {
"code": {
"query": "value3"
}
}
},
{
"match": {
"code": {
"query": "value4"
}
}
}
],
"should": [
{
"match": {
"code": {
"query": "value5"
}
}
},
{
"match": {
"code": {
"query": "value6"
}
}
}
],
"minimum_should_match": 1
}
}
}
我没有得到想要的答案(例如我没有任何值 5 和值 6 但仍然得到结果)
谢谢
那么你需要这样的东西:
{
"query": {
"bool": {
"must": [
{
"match": {
"code": {
"query": "value1"
}
}
},
{
"match": {
"code": {
"query": "value2"
}
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"code": {
"query": "value3"
}
}
},
{
"match": {
"code": {
"query": "value4"
}
}
}
]
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"code": {
"query": "value5"
}
}
},
{
"match": {
"code": {
"query": "value6"
}
}
}
]
}
}
]
}
}
}
这是
的 NEST 等价物
void Main()
{
var client = new ElasticClient();
client.Search<MyDocument>(s => s
.Query(q => q
.Bool(b => b
.Must(mu => mu
.Match(m => m
.Field(f => f.Code)
.Query("value1")
), mu => mu
.Match(m => m
.Field(f => f.Code)
.Query("value2")
), mu => mu
.Bool(bb => bb
.MinimumShouldMatch(1)
.Should(sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value3")
), sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value4")
)
)
), mu => mu
.Bool(bb => bb
.MinimumShouldMatch(1)
.Should(sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value5")
), sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value6")
)
)
)
)
)
)
);
}
public class MyDocument
{
public string Code { get; set; }
}
这是另一个使用更具体样本数据的示例:
{
"query": {
"bool": {
"must": [
{
"match": {
"author": {
"query": "Anita Author"
}
}
},
{
"match": {
"author": {
"query": "Bertha Booster"
}
}
}
],
"should":
[
{
"match": {
"title": {
"query": "A Fantastic Book"
}
}
},
{
"match": {
"title": {
"query": "A Fantastic Book, Volume 2"
}
}
},
{
"match": {
"title": {
"query": "Yet Another Fantastic Book"
}
}
}
],
"minimum_should_match": 1
}
}
}
我正在构建对 Elastic 5 的查询(使用 .net 中的嵌套),我正在尝试实现此结果:
必须有值 1 和值 2
应该有值 3 或值 4
并且应该有 value5 或 value6
这是我的查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"code": {
"query": "value1"
}
}
},
{
"match": {
"code": {
"query": "value2"
}
}
}
],
"should": [
{
"match": {
"code": {
"query": "value3"
}
}
},
{
"match": {
"code": {
"query": "value4"
}
}
}
],
"should": [
{
"match": {
"code": {
"query": "value5"
}
}
},
{
"match": {
"code": {
"query": "value6"
}
}
}
],
"minimum_should_match": 1
}
}
}
我没有得到想要的答案(例如我没有任何值 5 和值 6 但仍然得到结果)
谢谢
那么你需要这样的东西:
{
"query": {
"bool": {
"must": [
{
"match": {
"code": {
"query": "value1"
}
}
},
{
"match": {
"code": {
"query": "value2"
}
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"code": {
"query": "value3"
}
}
},
{
"match": {
"code": {
"query": "value4"
}
}
}
]
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"code": {
"query": "value5"
}
}
},
{
"match": {
"code": {
"query": "value6"
}
}
}
]
}
}
]
}
}
}
这是
void Main()
{
var client = new ElasticClient();
client.Search<MyDocument>(s => s
.Query(q => q
.Bool(b => b
.Must(mu => mu
.Match(m => m
.Field(f => f.Code)
.Query("value1")
), mu => mu
.Match(m => m
.Field(f => f.Code)
.Query("value2")
), mu => mu
.Bool(bb => bb
.MinimumShouldMatch(1)
.Should(sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value3")
), sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value4")
)
)
), mu => mu
.Bool(bb => bb
.MinimumShouldMatch(1)
.Should(sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value5")
), sh => sh
.Match(m => m
.Field(f => f.Code)
.Query("value6")
)
)
)
)
)
)
);
}
public class MyDocument
{
public string Code { get; set; }
}
这是另一个使用更具体样本数据的示例:
{
"query": {
"bool": {
"must": [
{
"match": {
"author": {
"query": "Anita Author"
}
}
},
{
"match": {
"author": {
"query": "Bertha Booster"
}
}
}
],
"should":
[
{
"match": {
"title": {
"query": "A Fantastic Book"
}
}
},
{
"match": {
"title": {
"query": "A Fantastic Book, Volume 2"
}
}
},
{
"match": {
"title": {
"query": "Yet Another Fantastic Book"
}
}
}
],
"minimum_should_match": 1
}
}
}