2013-04-26 9 views
12

Używam ElasticSearch w połączeniu z NEST w moim projekcie C#. Mój przypadek użycia zawiera kilka indeksów z różnymi typami dokumentów, które do tej pory osobno wysyłałem. Teraz chcę zaimplementować globalną funkcję wyszukiwania, która zapyta o wszystkie istniejące indeksy, typy dokumentów i poprawnie oceni wynik.NEST: Jak wykonywać kwerendy przeciwko wielu indeksom i obsługiwać różne podklasy (typy dokumentów)?

Moje pytanie: Jak to zrobić, używając NEST?

Obecnie używam funkcji SetDefaultIndex, ale jak mogę zdefiniować wiele indeksów?

Może dla lepszego zrozumienia, to jest kwerenda chcę zrealizować z NEST:

{ 
    "query": { 
    "indices": { 
     "indices": [ 
     "INDEX_A", 
     "INDEX_B" 
     ], 
     "query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     }, 
     "no_match_query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     } 
    } 
    } 
} 

TIA

Odpowiedz

15

można jednoznacznie powiedzieć gniazda, aby korzystać z wielu indeksach:

client.Search<MyObject>(s=>s 
    .Indices(new [] {"Index_A", "Index_B"}) 
    ... 
) 

Jeśli chcesz przeszukać wszystkie indeksy:

client.Search<MyObject>(s=>s 
    .AllIndices() 
    ... 
) 

Lub jeśli chcesz wyszukać jeden indeks (ów nie indeks domyślne)

client.Search<MyObject>(s=>s. 
    .Index("Index_A") 
    ... 
) 

Zapamiętaj od elasticsearch 19,8 Można również określić symboli wieloznacznych na nazwy indeksu

client.Search<MyObject>(s=>s 
    .Index("Index_*") 
    ... 
) 

Co do 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

Te testy pokazać w jaki sposób można uczynić C# 's praca kowariancji dla Ciebie:

https://github.com/Mpdreamz/NEST/blob/master/src/Nest.Tests.Integration/Search/SubClassSupport/SubClassSupportTests.cs

W twoim przypadku, jeśli wszystkie typy nie są podklasy wspólnej bazy można nadal używać «obiektu»

tj:

.Search<object>(s=>s 
     .Types(typeof(Product),typeof(Category),typeof(Manufacturer)) 
     .Query(...) 
); 

To będzie wyszukiwać /yourdefaultindex/products,categories,manufacturers/_search i konfiguracji domyślnej ConcreteTypeSelector że rozumie, co wpisać każdy wrócił DOCUME Nt jest.

Używając ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type>) możesz ręcznie zwrócić typ na podstawie pewnej wartości json (dynamicznej) lub metadanych trafienia.

+0

Witaj Martijn, dzięki za odpowiedź! Sposób na zapytanie o różne indeksy, które już wymyśliłem. Głównym problemem, z jakim obecnie borykam się jest to, że mam ** różne typy dokumentów o różnej strukturze ** przechowywane w indeksach takich jak książki, samochody itp. Mam na myśli twój przykład: klient. Wyszukiwarka MyObject będzie w moim Przypomnij sobie coś bardziej ogólnikowego, ponieważ chcę pobrać książki, samochody itp. za pomocą jednego zapytania. Próbowałem z typem ogólnym, ale bez powodzenia. – Neil

+0

Jedynym sposobem odzyskania dokumentów było użycie klienta. Wyszukiwarka (zapytanie).Dodałem również MapTypeIndices do ustawień połączenia (...). Czy mógłbyś podać przykład osiągnięcia czegoś takiego jak 'var results = Client.Search Neil

+0

Aktualizacja: Aktualnie używam podstawowa klasa książek, samochodów itp., ale nie jest to czyste rozwiązanie. 'client.Search ' – Neil

Powiązane problemy