2012-11-29 16 views

Odpowiedz

24

Domyślnie wszystkie pola są również indeksowane w polu specjalnym _all, co zapewnia dostęp do tzw. Funkcji catchall po wyjęciu z pudełka. Jednakże, można określić dla każdego pola w mapowaniu, czy chcesz, aby dodać go do pola _all lub nie, za pomocą opcji include_in_all:

"person" : { 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes", "include_in_all" : false 
     } 
    } 
} 

Powyższy przykład wyłącza domyślne zachowanie na polu nazwy, która wygrała nie będzie częścią pola _all.

W przeciwnym razie, jeśli nie trzeba boiska _all w ogóle dla określonego typu można ją wyłączyć, tak, znowu w swoim mapowania:

"person" : { 
    "_all" : {"enabled" : false}, 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes" 
     } 
    } 
} 

Kiedy go wyłączyć wasze pola nadal będą indeksowane osobno, ale nie będziesz miał funkcji catchall, którą _all zapewnia. Będziesz wtedy potrzebował zapytać o swoje konkretne pola zamiast polegać na _all specjalnym polu, to wszystko. W rzeczywistości, gdy kwerendy i nie określają pola, elasticsearch kwerendy pola _all pod maską, chyba że przesłonić domyślne pole do kwerendy.

+0

Dzięki za to! Mogę po prostu wyłączyć '_all', ponieważ nie używam tej funkcji i mam nadzieję, że powinno to zmniejszyć rozmiar indeksu. A jeśli dobrze rozumiem, jedyną opcją zmniejszania rozmiaru indeksu, jaki mam, jest określenie "not_analyzed" na polach, których nie szukam? – Michael

+2

Cóż, to nie jest tylko zmiana rozmiaru indeksu ... zmienia sposób indeksowania danych.Jeśli nie przeanalizujesz pola, będzie ono zawierać pojedynczy token. Nie będą używane żadne tokenizery ani filtry tokenów. Jeśli zawiera zdanie (z białymi znakami itp.), Aby je dopasować, należy zapytać o całe dokładne zdanie. Jeśli nigdy nie wyszukujesz pola, które ustawiłeś, indexed = false. – javanna

+0

Tak to właśnie myślałem. Dziękuję za wyjaśnienie. Mam pewne pola w moich dokumentach, takie jak "opis" lub "linki", których nigdy nie potrzebuję szukać, więc marnowanie zasobów na ich analizę. I testuję obecnie uruchamianie całego indeksu w pamięci ('{" index ": {" store.type ":" memory "}}'), więc rozmiar indeksu stanie się ważnym czynnikiem. – Michael

6

Każde pole ciągu ma parametr index w konfiguracji odwzorowania, który to jest defaults toanalyzed. Oznacza to, że oprócz pola _all każde pole jest indeksowane wyłącznie.

A dla _all field jest powiedziane, że w odniesieniu:

Domyślnie jest ona włączona i wszystkie pola są zawarte w nim na łatwość obsługi.

Więc do indeksowania całkowicie wyłączyć na polu trzeba podać (jeśli pole _all jest włączona):

"mappings": { 
     "your_mapping": { 
      "properties": { 
       "field_not_to_index": { 
        "type": "string", 
        "include_in_all": false, 
        "index": "no" 
       } 
      } 
     } 
    } 

Dla pól, które powinny być sprawdzony, czy włączyć je w polu _all (z "index": "no", aby zapisać zasoby), jeśli wyszukujesz za pomocą pola _all, lub jeśli pytasz na tych polach, używaj wyłącznie parametru o wartości dodatniej (analyzed lub) i wyłącz pole _all, aby zachować zasoby.

2

obserwuję jest ważnym strona doc zrozumieć ustawienia indeksu w elastycznej poszukiwaniu http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html

Twojego problemu, najlepiej należy ustawić flagę „Index”, aby nie we właściwościach terenowych.

+1

W tym łączu przykład pokazuje "index": "not_analyzed". Ale myślałem, że indeksowanie i analiza są różnymi koncepcjami w ES? Czy "nie" jest innym ustawieniem niż "not_analyzed"? Proszę o wyjaśnienie. – szeitlin

+2

'analizowane' Najpierw przeanalizuj ciąg, a następnie zindentuj go. Innymi słowy, indeksuj to pole jako pełny tekst. 'not_analyzed' Indeksuj to pole, aby można je było wyszukać, ale indeksuj wartość dokładnie tak, jak określono. Nie analizuj tego. 'no' Nie indeksuj tego pola w ogóle. Tego pola nie można wyszukać. – Tjorriemorrie

Powiązane problemy