您可以使用與查詢任何其他字段非常相似的方式在_type
元字段上進行查詢。要執行基於一個搜索查詢中不同類型的查詢,您可以使用bool
查詢與多個子句
client.Search<ISearchDto>(s => s
.From(from)
.Size(pageSize)
.Type(Types.Type(typeof(FirstSearchDto), typeof(SecondSearchDto)))
.Query(q => q
.Bool(b => b
.Should(sh => sh
.Bool(bb => bb
.Filter(
fi => fi.Term("_type", "firstSearchDto"),
fi => fi.Term(f => f.X, 1)
)
), sh => sh
.Bool(bb => bb
.Filter(
fi => fi.Term("_type", "secondSearchDto"),
fi => fi.Term(f => f.Y, 1)
)
)
)
)
)
);
我們有一個bool
查詢與2項should
條款;每個should
子句是一個bool
查詢,連接條件爲2 filter
,一個用於_type
,另一個用於分別查詢每個類型的屬性。
NEST支持操作符重載所以該查詢可以被寫入更簡潔地與
client.Search<ISearchDto>(s => s
.From(from)
.Size(pageSize)
.Type(Types.Type(typeof(FirstSearchDto), typeof(SecondSearchDto)))
.Query(q => (+q
.Term("_type", "firstSearchDto") && +q
.Term(f => f.X, 1)) || (+q
.Term("_type", "secondSearchDto") && +q
.Term(f => f.Y, 1))
)
);
兩者產生以下查詢
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [
{
"bool": {
"filter": [
{
"term": {
"_type": {
"value": "firstSearchDto"
}
}
},
{
"term": {
"x": {
"value": 1
}
}
}
]
}
},
{
"bool": {
"filter": [
{
"term": {
"_type": {
"value": "secondSearchDto"
}
}
},
{
"term": {
"y": {
"value": 1
}
}
}
]
}
}
]
}
}
}