我們可以在元數據_type
字段上進行查詢,並將其與其他字段上的查詢結合使用。這是一個例子。我們將創建100只貓和100只狗,將每隻貓設置爲禁用
void Main()
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "pets";
var connectionSettings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(connectionSettings);
if (client.IndexExists(defaultIndex).Exists)
client.DeleteIndex(defaultIndex);
client.CreateIndex(defaultIndex, ci => ci
.Mappings(m => m
.Map<Dog>(d => d.AutoMap())
.Map<Cat>(c => c.AutoMap())
)
);
var dogs = Enumerable.Range(1, 100).Select(i => new Dog
{
Name = $"Dog {i}"
});
client.IndexMany(dogs);
var cats = Enumerable.Range(1, 100).Select(i => new Cat
{
Name = $"Cat {i}",
Enabled = i % 2 == 0 ? false : true
});
client.IndexMany(cats);
client.Refresh(defaultIndex);
client.Search<object>(s => s
.Size(100)
.SearchType(SearchType.Count)
.Type(Types.Type(typeof(Dog), typeof(Cat)))
.Query(q =>
(+q.Term("_type", "cat") && +q.Term("enabled", true)) ||
+q.Term("_type", "dog")
)
);
}
搜索查詢利用運算符重載;一元+
運營商將意味着查詢將被包裹在bool
查詢filter
同樣,&&
將包裝成bool
查詢must
(或filter
在這種情況下,我們還可以使用+
元運算符,使其過濾器),和||
將包裝成bool
查詢should
。產生的執行的查詢看起來像
{
"size": 100,
"query": {
"bool": {
"should": [
{
"bool": {
"filter": [
{
"term": {
"_type": {
"value": "cat"
}
}
},
{
"term": {
"enabled": {
"value": true
}
}
}
]
}
},
{
"bool": {
"filter": [
{
"term": {
"_type": {
"value": "dog"
}
}
}
]
}
}
]
}
}
}
這將產生
這僅僅是一個數,但如果你看的文件,這將是所有的狗,只有已啓用
貓
有沒有什麼辦法可以單獨應用特定類型的過濾? – LMK