Ответ 1
Вы можете явно указать NEST использовать несколько индексов:
client.Search<MyObject>(s=>s
.Indices(new [] {"Index_A", "Index_B"})
...
)
Если вы хотите искать по всем индексам
client.Search<MyObject>(s=>s
.AllIndices()
...
)
Или если вы хотите найти один индекс (это не индекс по умолчанию)
client.Search<MyObject>(s=>s.
.Index("Index_A")
...
)
Помните, что после elasticsearch 19.8 вы также можете указать подстановочные знаки в именах индексов
client.Search<MyObject>(s=>s
.Index("Index_*")
...
)
Что касается вашего indices_query
client.Search<MyObject>(s=>s
.AllIndices()
.Query(q=>q
.Indices(i=>i
.Indices(new [] { "INDEX_A", "INDEX_B"})
.Query(iq=>iq.Term("FIELD","VALUE"))
.NoMatchQuery(iq=>iq.Term("FIELD", "VALUE"))
)
)
);
UPDATE
Эти тесты показывают, как вы можете сделать ковариацию С# для вас:
В вашем случае, если все типы не являются подклассами общей базы, вы все равно можете использовать "объект"
то есть:
.Search<object>(s=>s
.Types(typeof(Product),typeof(Category),typeof(Manufacturer))
.Query(...)
);
Это будет поиск по /yourdefaultindex/products,categories,manufacturers/_search
и настройка по умолчанию ConcreteTypeSelector
, который понимает, какой тип каждого возвращаемого документа есть.
Используя ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type>)
, вы можете вручную вернуть тип, основанный на некотором значении json (в динамическом режиме) или метаданных попадания.