curl 'http://localhost/solr/collection/update?commit=true' 
-H 'Content-type:application/json' 
-d 
'[ 
  { 
    "id":"11111", 
    "price":{"set":1000} 
  }
]'

Si existe id: 11111, se actualiza el valor del precio. Está bien.

Si el id: 11111 no existe, se crea un nuevo documento en el índice solr. Este comportamiento no es deseable. Espero un error con algún texto como: el documento que intentó actualizar no existe. No puedo entender lo que está mal.

Versión de Solr: 4.8.0.

Parte de schema.xml:

<field name="id" type="string"  indexed="true" stored="true" required="true"/>
<uniqueKey>id</uniqueKey>
2
Dimitry 13 nov. 2017 a las 02:39

2 respuestas

La mejor respuesta

El controlador de solicitudes /update en realidad actualiza el índice para documentos nuevos y existentes y también maneja la eliminación.

Durante la indexación:

  • Un documento se considera nuevo si no tiene identificador o si su identificación no coincide con ninguno de los documentos indexados. Si no se genera una identificación durante la indexación y si se requiere el campo uniqueKey, el documento se rechaza.
  • Un documento que tiene un identificador que coincide con un documento indexado se fusiona con su versión almacenada: todos los campos almacenados se cargan desde el índice y se reemplazan por los valores de campo de los parámetros de solicitud, y el documento resultante reemplaza al anterior (pero al final es la misma operación).

En otras palabras, una solicitud de actualización, si no es una eliminación , siempre termina en la misma operación de agregar . Por cierto, el esquema XML reconocido por solr.UpdateRequestHandler contiene los elementos <add> , <doc> y <field> independientemente de la operación (agregar o reemplazar).

Las versiones recientes de Solr ofrecen más opciones para actualizar partes de los documentos. (consulte actualizaciones atómicas y actualizaciones in situ.

Lo que describe es el comportamiento esperado. Dado que el campo id es obligatorio, Solr arrojará un error para el documento que falta este campo. En su situación, el documento está indexado en ambos casos porque la identificación se proporciona en ambos casos.

Con esta configuración, debería asegurarse de que el campo id esté vacío para lo que considera un documento nuevo, ya sea del lado del cliente al preparar la solicitud o del lado del servidor utilizando un procesador de actualización o actualizando la implementación del controlador de solicitudes. ¿Quizás sería aún más sencillo evitar la indexación de nuevos documentos?

0
EricLavault 15 nov. 2017 a las 10:04

Así es como parece funcionar la implementación actual de las actualizaciones Atomic. Estoy de acuerdo en que podría ser deseable obtener un error ... Debería plantear el problema en la lista de correo de usuarios y ver lo que piensan los confirmantes, tal vez estén de acuerdo con usted en que debería producirse un error, le pedirán que abra jira entonces.

Oh, acabo de notar la versión 4.8, que es bastante antigua, ¿puedes por casualidad probar el comportamiento en las versiones actuales?

0
Persimmonium 13 nov. 2017 a las 19:02