2015-12-13 11 views
5

Ho un problema con Solr 5.3.1. Il mio schema è piuttosto semplice. Ho un uniqueKey che è "id" come stringa. indicizzato, memorizzato e richiesto, non multivalore.Solr non sovrascrive - voci univoche duplicate

Aggiungo i documenti prima con un "content_type: document_unfinished" e quindi sovrascrivi lo lo stesso documento, con lo stesso id ma un altro content_type: document. Il documento è quindi due volte nell'indice. Ancora una volta, l'unica uniqueKey è "id", come stringa. L'id proviene originariamente da un int primario mysql-index.

sembra anche questo accade non solo una volta:

http://lucene.472066.n3.nabble.com/uniqueKey-not-enforced-td4015086.html

http://lucene.472066.n3.nabble.com/Duplicate-Unique-Key-td4129651.html

Nel mio caso non tutti i documenti nell'indice sono duplicati, solo alcuni. Inizialmente, stavo dando per scontato che venissero sovrascritti sul commit quando esiste la stessa uniqueKey nell'indice. Che non sembra funzionare come mi aspettavo. Non voglio semplicemente aggiornare alcuni campi nel documento, voglio sostituirlo completamente con tutti i bambini.

Alcune statistiche: circa 350k documenti nell'indice. Principalmente con childDocuments. I documenti sono contraddistinti da un campo "content_type". Ho usato SolrJ per importarli in questo modo:

HttpSolrServer server = new HttpSolrServer(url); 
server.add(a Collection<SolrInputDocument>); 
server.commit(); 

Aggiungo sempre un intero documento a tutti i bambini. Non è niente di eccessivamente elegante. Finisco con documenti duplicati per lo stesso uniqueKey. Non ci sono iniezioni laterali. Corro solo Solr con il Jetty integrato. Non apro l'indice lucene in java "manualmente".

Quello che ho fatto è stato quello di eliminare + inserire di nuovo. Che sembrava di lavorare per un po ', ma poi ha iniziato in alcune condizioni di dare questo messaggio di errore:

Parent documento rendimenti di query che non è compensata dai genitori filtro

Il documento in cui ciò accade sembra essere completamente casuale, sembra emergere solo una cosa: è un documento figlio in cui accade. Non eseguo nulla di speciale, in pratica ho scaricato il pacchetto solr dal sito web ed eseguito con bin/solr start

Qualche idea?

EDIT 1

Credo di aver trovato il problema, che sembra essere un bug? Per riprodurre il problema:

Ho scaricato Solr 5.3.1 su un Debian in una virtualBox e l'ho avviato con bin/solr start. Aggiunto un nuovo core con il set di configurazione di base. Nulla è cambiato nel set di configurazione di base, è appena stato copiato e aggiunto il core.

Questo porta a due documenti con lo stesso ID nell'indice:

SolrClient solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1"); 
    SolrInputDocument inputDocument = new SolrInputDocument(); 
    inputDocument.setField("id", "1"); 
    inputDocument.setField("content_type_s", "doc_unfinished"); 
    solrClient.add(inputDocument); 
    solrClient.commit(); 
    solrClient.close(); 

    solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1"); 
    inputDocument = new SolrInputDocument(); 
    inputDocument.setField("id", "1"); 
    inputDocument.setField("content_type_s", "doc"); 
    SolrInputDocument childDocument = new SolrInputDocument(); 
    childDocument.setField("id","1-1"); 
    childDocument.setField("content_type_s", "subdoc"); 
    inputDocument.addChildDocument(childDocument); 
    solrClient.add(inputDocument); 
    solrClient.commit(); 
    solrClient.close(); 

Ricerca con:

http://192.168.56.102:8983/solr/test1/select?q=% 3A & wt = json & trattino = true

porta a il seguente risultato:

{ 

    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "q": "*:*", 
     "indent": "true", 
     "wt": "json", 
     "_": "1450078098465" 
    } 
    }, 
    "response": { 
    "numFound": 3, 
    "start": 0, 
    "docs": [ 
     { 
     "id": "1", 
     "content_type_s": "doc_unfinished", 
     "_version_": 1520517084715417600 
     }, 
     { 
     "id": "1-1", 
     "content_type_s": "subdoc" 
     }, 
     { 
     "id": "1", 
     "content_type_s": "doc", 
     "_version_": 1520517084838101000 
     } 
    ] 
    } 
} 

Cosa sto sbagliando?

+0

attualmente sto affrontando una situazione che sembra essere molto simile al tuo: io uso anche SolrJ, io uso anche childDocuments, e ho anche recentemente rilevato , che su un semplice aggiornamento di un documento, af il documento esiste due volte con la stessa chiave univoca nell'indice. Ho anche pensato che avrei potuto provare a eliminare esplicitamente il documento tramite solrClient.deleteById (id), che sembra risolvere il problema - tuttavia, poiché dichiari che questa non è una soluzione reale, mi preoccupo ancora. – SebastianRiemer

+0

Ho scritto una piccola applicazione di test Java che genera il problema come descritto da voi. Può essere trovato qui: https://github.com/sebastianriemer/SolrDuplicateTest Sarei interessato a sapere se si ottiene lo stesso risultato come me. Ho anche scritto la mailing list di solr-user e posterò le risposte qui. – SebastianRiemer

+0

Penso che stavo leggendo da qualche parte che Solr sta trattando documenti con documenti secondari diversi da quelli senza. Non riesco a ricordare dove stavo leggendo, ma ho iniziato ad aggiungere un documento secondario subito, dal primo documento in poi. La sovrascrittura funziona quindi per me da allora - ma lo considero ancora un "bug" di Solr che non tratta le chiavi univoche ... come ... beh ... unico. Sto aggiungendo alcuni documenti da 10k all'indice ogni giorno e funziona. –

risposta

3

Grazie per il vostro feedback! Scrivo questo come risposta poiché è troppo lungo altrimenti. Io in realtà avuto la stessa risposta dalla mailing list:

Mikhail Khludnev Ciao Sebastian,

miscelazione docs standalone e blocchi non funziona. Ci sono un sacco di problemi aperti.

il Wed, Mar 9, 2016 alle 15:02, Sebastian Riemer ha scritto:

Ciao,

per descrivere in realtà il mio problema in breve, invece di collegamento a il test applicaton, utilizzando SolrJ faccio la seguente:

1) Creare un nuovo documento come un genitore e si impegnano

SolrInputDocument parentDoc = new SolrInputDocument(); 
    parentDoc.addField("id", "parent_1"); 
    parentDoc.addField("name_s", "Sarah Connor"); 
    parentDoc.addField("blockJoinId", "1"); 
    solrClient.add(parentDoc); 
    solrClient.commit(); 

2) Creare un nuovo documento con lo stesso unico-id come in 1) con un documento secondario allegato

SolrInputDocument parentDocUpdateing = new SolrInputDocument(); 
    parentDocUpdateing.addField("id", "parent_1"); 
    parentDocUpdateing.addField("name_s", "Sarah Connor"); 
    parentDocUpdateing.addField("blockJoinId", "1"); 

    SolrInputDocument childDoc = new SolrInputDocument(); 
    childDoc.addField("id", "child_1"); 
    childDoc.addField("name_s", "John Connor"); 
    childDoc.addField("blockJoinId", "1"); 

    parentDocUpdateing.addChildDocument(childDoc); 
    solrClient.add(parentDocUpdateing); 
    solrClient.commit(); 

3) Risultati in 2 documenti con id = "parent_1" nell'indice solr

È normale questo comportamento? Ho pensato che il documento esistente dovrebbe essere aggiornato invece di generare un nuovo documento con lo stesso id.

Per un'applicazione di prova di lavoro completa, vedere il messaggio originale.

Con i migliori saluti, Sebastian

penso che è un problema noto, ed esistono vari biglietti che tipo di si riferiscono a questo, ma mi fa piacere che ci sia un modo per affrontare il problema (aggiungendo docs bambino fin dall'inizio) (https://issues.apache.org/jira/browse/SOLR-6096, https://issues.apache.org/jira/browse/SOLR-5211, https://issues.apache.org/jira/browse/SOLR-7606)

+0

Grazie per l'estate il problema. Non sono sicuro che sia davvero una soluzione. Mi ricorda semplicemente una soluzione davvero pessima. Ad ogni modo, accetterò è come una risposta, anche se non sono molto contento di questo comportamento. Tipo di una delusione che non è menzionata nelle lettere in grassetto nella documentazione solr ... –

Problemi correlati