2016-06-30 113 views
3

ElasticSearch NEST查詢鑑於以下波蘇斯:跨多種類型

public class Dog 
{ 
    public string Name { get; set; } 
} 

public class Cat 
{ 
    public string Name { get; set; } 
    public bool Enabled { get; set; } 
} 

我想執行返回所有狗和貓只被啓用的查詢。

彈性文檔提供了以下的例子,但不是如何使用布爾與查詢或過濾器上下文跨多個類型的搜索特定的字段值的任何一個細節:

.Search<object>(s => s 
    .Size(100) 
    .Type(Types.Type(typeof(Dog), typeof(Cat)))     
    .Query(...) 

如何執行我的查詢? ,請提前致謝

+0

有沒有什麼辦法可以單獨應用特定類型的過濾? – LMK

回答

2

我們可以在元數據_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" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

這將產生

​​

這僅僅是一個數,但如果你看的文件,這將是所有的狗,只有已啓用

+0

有沒有什麼辦法可以單獨對特定類型應用過濾? – LMK