Solr não sobrescreve - entradas duplicadas exclusivas
Estou com um problema com o Solr 5.3.1. Meu esquema é bastante simples. Eu tenho uma uniqueKey que é o "id" como string. indexados, armazenados e necessários, sem valores múltiplos.
Eu adiciono documentos primeiro com um "content_type: document_unfinished" e depoissubstituir o mesmo documento, com o mesmo ID, mas outro content_type: document. O documento é então duas vezes no índice. Novamente, a únicaKey única é "id", como string. O id vem originalmente de um int primário do índice mysql.
Também parece que isso acontece não apenas uma vez:
http://lucene.472066.n3.nabble.com/uniqueKey-not-enforced-td4015086.html
http://lucene.472066.n3.nabble.com/Duplicate-Unique-Key-td4129651.html
No meu caso, nem todos os documentos no índice são duplicados, apenas alguns. Eu estava assumindo - inicialmente - que eles estavam sendo substituídos no commit quando a mesma chave única existe no índice. O que não parece funcionar como eu esperava. Não quero simplesmente atualizar alguns campos do documento, quero substituí-lo completamente, por todos os filhos.
Algumas estatísticas: cerca de 350 mil documentos no índice. Principalmente com childDocuments. Os documentos são distinguidos por um campo "content_type". Eu usei o SolrJ para importá-los dessa maneira:
HttpSolrServer server = new HttpSolrServer(url);
server.add(a Collection<SolrInputDocument>);
server.commit();
Estou sempre adicionando um documento inteiro com todas as crianças novamente. Não é nada demais demais. Acabo com documentos duplicados para a mesma chave única. Não há injeções laterais. Eu corro apenas o Solr com o Jetty integrado. Não abro o índice lucene em java "manualmente".
O que fiz então foi excluir + inserir novamente. Isso pareceu funcionar por um tempo, mas, em seguida, foi iniciado sob algumas condições, e esta mensagem de erro:
A consulta pai produz um documento que não corresponde ao filtro de pais
O documento em que isso acontece parece ser completamente aleatório, apenas uma coisa parece emergir: é um childDocument onde acontece. Eu não corro nada de especial, basicamente baixei o pacote solr do site e execute-o combin/solr start
Alguém tem alguma idéia?
EDIT 1
Acho que encontrei o problema, o que parece ser um bug? Para reproduzir o problema:
Eu baixei o Solr 5.3.1 para um Debian em um virtualBox e o iniciei combin/solr start
. Adicionado um novo núcleo com o conjunto de configurações básicas. Nada mudou no conjunto de configurações básicas, apenas o copiou e adicionou o núcleo.
Isso leva a dois documentos com o mesmo ID no índice:
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();
Pesquisando com:
http://192.168.56.102:8983/solr/test1/select?q=% 3A& wt = json & indent = true
leva à seguinte saída:
{
"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
}
]
}
}
O que estou fazendo errado?