2012-01-26 17 views
5

Mam konfigurację ElasticSearch, odbierając dane do indeksu za pośrednictwem rzeki CouchDB. Mam problem z tym, że większość pól w dokumentach CouchDB nie ma znaczenia dla wyszukiwania: są to pola używane wewnętrznie przez aplikację (identyfikatory i tym podobne) i nie chcę otrzymywać fałszywych alarmów z powodu tych pól. Poza tym indeksowanie niepotrzebnych danych wydaje mi się marnowaniem zasobów.ElasticSearch: Indeksuj tylko pola określone w mapowaniu

Aby rozwiązać ten problem, zdefiniowałem mapowanie, w którym określam pola, które chcę zindeksować. Używam pyes, aby uzyskać dostęp do ElasticSearch. Proces, który obserwuję, to:

  1. Utwórz rzekę CouchDB, powiązaną z indeksem. To najwyraźniej tworzy także indeks i tworzy mapowanie "couchdb" w tym indeksie, które, o ile widzę, obejmuje wszystkie pola, z dynamicznie przypisanymi typami.
  2. Umieść mapowanie, ograniczając je do pól, które naprawdę chcę indeksować.

Jest to definicja indeksu otrzymany przez:

curl -XGET http://localhost:9200/notes_index/_mapping?pretty=true 

{ 
    "notes_index" : { 
    "default_mapping" : { 
     "properties" : { 
     "note_text" : { 
      "type" : "string" 
     } 
     } 
    }, 
    "couchdb" : { 
     "properties" : { 
     "_rev" : { 
      "type" : "string" 
     }, 
     "created_at_date" : { 
      "format" : "dateOptionalTime", 
      "type" : "date" 
     }, 
     "note_text" : { 
      "type" : "string" 
     }, 
     "organization_id" : { 
      "type" : "long" 
     }, 
     "user_id" : { 
      "type" : "long" 
     }, 
     "created_at_time" : { 
      "type" : "long" 
     } 
     } 
    } 
    } 
} 

Problem, który mam jest on wielokrotnie:

  • że domyślna "couchdb" mapowanie indeksowanie wszystkich pól. Nie chcę tego. Czy można uniknąć tworzenia tego mapowania? Jestem zdezorientowany, ponieważ to odwzorowanie wydaje się być tym, które w jakiś sposób "łączy" się z rzeką CouchDB.
  • odwzorowanie że tworzę wydaje się nie mieć żadnego wpływu: nie istnieją żadne dokumenty indeksowane przez tego mapowania

Czy masz jakieś rady w tej sprawie?

EDIT

To co ja właściwie robi, dokładnie tak, jak wpisane:

server="localhost" 

# Create the index 
curl -XPUT "$server:9200/index1" 

# Create the mapping 
curl -XPUT "$server:9200/index1/mapping1/_mapping" -d ' 
{ 
    "type1" : { 
     "properties" : { 
      "note_text" : {"type" : "string", "store" : "no"} 
     } 
    } 
} 
' 

# Configure the river 
curl -XPUT "$server:9200/_river/river1/_meta" -d '{ 
    "type" : "couchdb", 
    "couchdb" : { 
     "host" : "localhost", 
     "port" : 5984, 
     "user" : "admin", 
     "password" : "admin", 
     "db" : "notes" 
    }, 
    "index" : { 
     "index" : "index1", 
     "type" : "type1" 
    } 
}' 

Dokumenty w index1 nadal zawierają pola inne niż „note_text”, który jest tylko jeden że ja zostały wyraźnie wymienione w definicji mapowania. Dlaczego?

Odpowiedz

0

Domyślnym zachowaniem rzeki CouchDB jest użycie "dynamicznego" mapowania, tzn. Indeksowania wszystkich pól znajdujących się w przychodzących dokumentach CouchDB. Masz rację, że może niepotrzebnie zwiększyć rozmiar indeksu (twoje problemy z wyszukiwaniem można rozwiązać poprzez wykluczenie niektórych pól z zapytania).

Aby użyć własnego mapowania zamiast „dynamiczny” jeden, trzeba skonfigurować wtyczkę rzekę używać utworzoną mapowania (patrz this article):

curl -XPUT 'elasticsearch-host:9200/_river/notes_index/_meta' -d '{ 
    "type" : "couchdb", 

    ... your CouchDB connection configuration ... 

    "index" : { 
     "index" : "notes_index", 
     "type" : "mapping1" 
    } 
}' 

Nazwa typu, określasz w adresie URL podczas wykonywania mapowania PUT zastępujesz ten, który dołączasz do definicji, więc tworzony typ jest w rzeczywistości mapping1. Spróbuj wykonać to polecenie, aby przekonać się samemu:

> curl 'localhost:9200/index1/_mapping?pretty=true' 

{ 
    "index1" : { 
    "mapping1" : { 
     "properties" : { 
     "note_text" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

Myślę, że jeśli otrzymasz nazwę typu, zacznie działać poprawnie.

+0

Dzięki za komentarz, ale coś jest niejasne. Gdzie mogę użyć mojego mapowania (nazwałem go 'default_mapping') w tym żądaniu PUT? – dangonfast

+0

Masz jedno mapowanie na indeks, ale możesz mieć wiele "typów" zadeklarowanych w każdym mapowaniu. Nie byłem pewien, jakiego typu odwzorowania zamierzałeś użyć - masz dwa z nich: 'couchdb' i' default_mapping'. Po prostu zmień wartość dla klucza 'type' w konfiguracji rzeki. –

+0

Mam edytowane oryginalne pytanie, pokazujące teraz aktualne żądania POST, które robię, aby skonfigurować ES. To nadal nie działa: wszystkie pola są nadal indeksowane. – dangonfast

Powiązane problemy