Importation et mise à jour de données dans Elasticsearch

nous avons une fonction de recherche existante qui implique des données à travers plusieurs tables dans SQL Server. Cela entraîne une lourde charge sur notre base de données, donc j'essaie de trouver une meilleure façon de chercher à travers ces données (cela ne change pas très souvent). J'ai travaillé avec Logstash et Elasticsearch pendant environ une semaine en utilisant une importation contenant 1,2 millions de disques. Ma question est essentiellement la suivante:"Comment puis-je mettre à jour des documents existants en utilisant ma "clé primaire"?

fichier de données CSV (délimité par un tuyau) looks comme ceci:

369|90045|123 ABC ST|LOS ANGELES|CA
368|90045|PVKA0010|LA|CA
367|90012|20000 Venice Boulvd|Los Angeles|CA
365|90045|ABC ST 123|LOS ANGELES|CA
363|90045|ADHOCTESTPROPERTY|DALES|CA

Mon logstash config ressemble à ceci:

input {
  stdin {
    type => "stdin-type"
  }

  file {
    path => ["C:/Data/sample/*"]
    start_position => "beginning"
  }
}

filter {
  csv {
    columns => ["property_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

output {
  elasticsearch {
    embedded => true
    index => "samples4"
    index_type => "sample"
  }
}

Un document dans elasticsearch, ressemble alors à ceci:

{
   "_index": "samples4",
   "_type": "sample",
   "_id": "64Dc0_1eQ3uSln_k-4X26A",
   "_score": 1.4054651,
   "_source": {
   "message": [
      "369|90045|123 ABC ST|LOS ANGELES|CAr"
   ],
   "@version": "1",
   "@timestamp": "2014-02-11T22:58:38.365Z",
   "host": "[host]",
   "path": "C:/Data/sample/sample.csv",
   "property_id": "369",
   "postal_code": "90045",
   "address_1": "123 ABC ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}

I penser voudrais l'ID unique de l' _id champ, pour être remplacé par la valeur de property_id. L'idée est que les fichiers de données ultérieurs contiennent des mises à jour. Je n'ai pas besoin de garder les versions précédentes et il n'y aurait pas un cas où nous avons ajouté ou retiré des clés d'un document.

document_id le paramétrage pour la sortie elasticsearch ne met pas la valeur de ce champ dans _id (il vient de mettre dans "property_id" et seulement stocké/mis à jour un document). Je sais que je suis absent quelque chose ici. Je suis juste de prendre la bonne approche?

EDIT: WORKING!

en utilisant la suggestion de @rutter, j'ai mis à jour le output config à ce:

maintenant les documents sont mis à jour en déposant de nouveaux fichiers dans les données dossier comme prévu. _id et property_id ont la même valeur.

17
demandé sur Adrian J. Moreno 2014-02-12 04:12:18

3 réponses

Conversion de commentaire:

vous pouvez réécrire un document en envoyant un autre document avec le même ID... mais cela pourrait être délicat avec vos données précédentes, puisque vous obtiendrez des ID aléatoires par défaut.

vous pouvez définir un ID en utilisant le plugin de sortie document_id champ, mais il faut une chaîne littérale, pas un nom de champ. Utiliser un champ de contenu, vous pouvez utiliser un sprintf chaîne de format, comme %{property_id}.

quelque Chose comme ceci, par exemple:

output {
  elasticsearch {
    ... other settings...
    document_id => "%{property_id}"
  }
}
13
répondu rutter 2014-02-12 20:09:52

declaimer - je suis l'auteur de l'ESL

Vous pouvez utiliser elasticsearch_loader pour charger les fichiers psv dans elasticsearch.

Pour définir le champ _id, vous pouvez utiliser --id-field=property_id. par exemple:

elasticsearch_loader --index=myindex --type=mytype --id-field=property_id csv --delimiter='|' filename.csv

1
répondu MosheZada 2017-02-25 19:33:00

Avez-vous essayé de changer la config:

filter {
  csv {
    columns => ["_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

en nommant property_id comme _id, il devrait être utilisé pendant l'indexation.

0
répondu Akshay 2014-02-12 10:53:26