2013-08-14 27 views
33

Mam pole w polu ElasticSearch, którego nie chcę analizować, i. mi. powinien być przechowywany i porównywany dosłownie. Wartości będą zawierać litery, cyfry, spacje, kreski, ukośniki i być może inne znaki.Jak nie analizować w ElasticSearch?

Jeśli nie podam analizatora w moim mapowaniu dla tego pola, domyślnie nadal korzysta się z tokenizera, który łamie mój słowny ciąg w kawałki słów. Nie chcę tego.

Czy istnieje super prosty analizator, który zasadniczo nie analizuje? Czy istnieje inny sposób oznaczania, że ​​to pole nie będzie analizowane?

Tworzę tylko indeks, nie robię nic więcej. Mogę używać analizatorów takich jak "angielski" dla innych pól, które wydają się być wbudowanymi nazwami dla wstępnie skonfigurowanych analizatorów. Czy istnieje lista innych nazw? Być może jeden pasuje do moich potrzeb (a mianowicie nie robi nic z danymi wejściowymi).

To jest mój mapowanie obecnie:

{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string" } 
    } 
    } 
} 

my_field1 jest zależne od języka; to wydaje się działać. my_field2 będzie dosłownie. Chciałbym dać analizator, który po prostu nic nie robi.

Przykładowa wartość dla my_field2 to "B45c 14/04".

Odpowiedz

47
"my_field2": { 
    "properties": { 
     "title": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

Sprawdź tutaj, https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-core-types.html, aby uzyskać więcej informacji. Można również użyć analizatora

+0

Ah! Tego właśnie szukałem. Kilka razy natknąłem się na to "not_analized", ale zawsze uważałem, że używanie go oznaczałoby, że nie można go w ogóle przeszukiwać (najwyraźniej do tego służy słowo "no"). Link do dokumentacji był pouczający, dziękuję! (I z czasem zaakceptuję tę odpowiedź, chyba że pojawi się jeszcze bardziej pomocna.) – Alfe

+1

@Alfe, możesz mieć w [tej odpowiedzi więcej informacji] (http://stackoverflow.com/questions/16911633/not-indexed-field -is-stored-in-index/16923084 # 16923084) z opcją 'index: no' – ramseykhalaf

+2

Czy możemy ustawić globalnie, aby nie analizować typu łańcucha dla wszystkich? – coderek

2

keyword.

// don't actually use this, use "index": "not_analyzed" instead 
{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string", "analyzer": "keyword" } 
    } 
    } 
} 

Jak wspomniano tutaj: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html, to ma większy sens, aby zaznaczyć te pola jako not_analyzed.

Ale analizator może być przydatny, gdy jest ustawiony domyślnie dla całego indeksu.

UPDATE: Jak to powiedział w komentarzach, string nie jest już obsługiwana w 5.X

+3

w rzeczywistości analizator "keyword" analizuje pole, ale tylko raz jako całość. może nie być pożądane, gdy jest ustawiony na niektórych dużych polach tekstowych, takich jak ~ zawartość MB - przejdzie do indeksu i zje trochę zasobów. – ulkas

+1

Ponadto pole 'string' nie jest obsługiwane dla indeksów utworzonych w 5.x na rzecz pól' text' i 'keyword'. – lifeisfoo

3

To nie jest już prawdą ze względu na usunięcie string (zastąpiony przez keyword i ``) typu jak opisane here. Zamiast tego powinieneś użyć "index": true | false. Dla przykładu Wiek:

{ 
    "foo": { 
    "type" "string", 
    "index": "not_analyzed" 
    } 
} 

staje się nową:

{ 
    "foo": { 
    "type" "keyword", 
    "index": true 
    } 
} 

Oznacza to, że pole jest indeksowany, ale jak to jest sklasyfikowany jako keyword nie analizowano zastrzeżeń.