2012-01-26 22 views
5

Tengo una configuración de ElasticSearch, recibiendo datos para indexar a través de un río CouchDB. Tengo el problema de que la mayoría de los campos en los documentos de CouchDB no son relevantes para la búsqueda: son campos usados ​​internamente por la aplicación (IDs, etc.) y no quiero obtener falsos positivos debido a estos campos. Además, la indexación de datos no necesarios me parece un desperdicio de recursos.ElasticSearch: Indexe solo los campos especificados en la asignación

Para resolver este problema, he definido una asignación en la que especifico los campos que deseo indexar. Estoy usando pyes para acceder a ElasticSearch. El proceso que sigo es:

  1. Crea el río CouchDB, asociado a un índice. Esto aparentemente crea también el índice y crea un mapeo "couchdb" en ese índice que, hasta donde puedo ver, incluye todos los campos, con tipos asignados dinámicamente.
  2. Ponga una asignación, vuelva a restringirla a los campos que realmente quiero indexar.

Ésta es la definición del índice tal como se obtiene por:

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" 
     } 
     } 
    } 
    } 
} 

El problema que tengo es manyfold:

  • que el "couchdb" mapeo por defecto está indexando todos los campos. No quiero esto. ¿Es posible evitar la creación de ese mapeo? Estoy confundido, porque ese mapeo parece ser el que de alguna manera se está "conectando" al río CouchDB.
  • la asignación que se crea parece no tener ningún efecto: no hay documentos indexados por que la cartografía

¿Tiene algún consejo sobre esto?

EDITAR

Esto es lo que estoy haciendo en realidad, exactamente como se ha escrito:

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" 
    } 
}' 

Los documentos en index1 todavía contienen campos que no sean "note_text", que es el única que yo han mencionado específicamente en la definición del mapeo. ¿Porqué es eso?

Respuesta

0

El comportamiento predeterminado de CouchDB river es utilizar una asignación "dinámica", es decir, indexar todos los campos que se encuentran en los documentos CouchDB entrantes. Tiene razón en que puede aumentar innecesariamente el tamaño del índice (sus problemas con la búsqueda pueden resolverse excluyendo algunos campos de la consulta).

Para utilizar su propia asignación en lugar de la 'dinámica' uno, es necesario configurar el plug-in Río de usar el mapeo que ha creado (ver this article):

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

    ... your CouchDB connection configuration ... 

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

El nombre del tipo que está especificando en la URL mientras realiza la asignación PUT, anula la que está incluyendo en la definición, por lo que el tipo que está creando es, de hecho, mapping1. Intente ejecutar este comando para ver por sí mismo:

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

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

Creo que si obtendrá el nombre del tipo correcto, que comenzará a trabajar muy bien.

+0

Gracias por su comentario, pero algo no está claro. ¿Dónde hago uso de mi mapeo (lo llamé 'default_mapping') en esa solicitud PUT? – dangonfast

+0

Tiene un mapeo por índice, pero puede tener múltiples 'tipos' declarados en cada mapeo. No estaba seguro de qué tipo de mapeo pretendía usar; tiene dos de ellos: 'couchdb' y' default_mapping'. Simplemente cambie el valor de la tecla 'tipo' en la configuración del río. –

+0

He editado la pregunta original, mostrando ahora las solicitudes POST reales que estoy haciendo para configurar ES. Esto todavía no funciona: todos los campos todavía están indexados. – dangonfast

Cuestiones relacionadas