Verwenden Sie die Elasticsearch Java-API (BulkRequest-Registrierung) [Zusätzliche Hinweise]

Mit Elasticsearch können Sie die Java-API verwenden.

Offizielles Dokument der Elasticsearch Java API

Dies ist recht praktisch, aber es scheint, dass nicht viele Informationen verfügbar sind, also habe ich es zusammengefasst.

[12.01.2018] Nachtrag

Der in diesem Artikel verwendete `` `TransportClient``` ist ab der nächsten Hauptversion 7 veraltet und wird in 8 entfernt. Daher wird empfohlen, auf "High Level REST Client" zu migrieren. Weitere Informationen finden Sie im Kommentarbereich. Vielen Dank für den Hinweis, Johtani.

Bedarf

Ich würde es gerne mit einem solchen Bild machen.

Entwicklungsumgebung

Datenstruktur

Im Fall von RDB werden Zweigstelleninformationen und Buchtitelinformationen in separaten TBLs gespeichert, und Verkaufs-TBLs werden erstellt und verbunden. Im Fall von ELS handelt es sich jedoch um Daten für jede Zeile. Registrieren Sie mehrere Datensätze. Ich bin der Meinung, dass ELS-Aufzeichnungen einfach zu erstellen sind, wenn Sie ein ansichtsähnliches Bild haben.

Ist die Rate (Gewichtung) für diesen Datensatz charakteristisch? In der Rangliste ist der 1. Platz normalerweise der höchste und die Rangliste sinkt mit zunehmender Anzahl. Wenn Sie jedoch versuchen, diese Rangfolge auf der Y-Achse des Faltliniendiagramms anzuzeigen, müssen Sie den Wert anzeigen, wenn der Wert auf der Y-Achse steigt. Dies ist das Gegenteil des üblichen Werts, der mit ELS schwer auszudrücken ist. ist. Referenz (oder besser gesagt meine frühere Frage): Ranglistenanzeige in einem Diagramm mit unterbrochenen Linien

Daher ist die Rate das Ergebnis der Konvertierung des Rangfolgenwerts in Form einer Gewichtung, sodass das Diagramm leicht angezeigt werden kann.

Methode zur Berechnung der Rate:(Gesamtrangliste) - (Eigener Rangwert) + 1

Wenn sich die Gesamtzahl der Ranglisten bewegt, ändert sich die Grafikanzeige auf 100 oder 1000 und es wird immer ein fester Wert verwendet.

Verwenden Sie eine beliebige Methode, um einen JSON zu erstellen, der in ELS importiert werden kann.

JSON

branch	title	author	genre	ranking	rate	execDate
Shinjuku Titel Ein Autor Ahn Comic-girl	1	3	2018/01/11T13:00:00+09:00
Shinjuku Titel B Autor und später Comic-male	2	2	2018/01/11T13:00:00+09:00
Shinjuku Titel C Autor U Comic-girl	3	1	2018/01/11T13:00:00+09:00
Marunouchi Titel C Autor U Comic-girl	1	3	2018/01/11T13:00:00+09:00
Marunouchi Titel Ein Autor Ahn Comic-girl	2	2	2018/01/11T13:00:00+09:00
Marunouchi Titel D Comic des Autors-boy	3	1	2018/01/11T13:00:00+09:00
Shinagawa Titel B Autor und später Comic-male	1	3	2018/01/11T13:00:00+09:00
Shinagawa Titel C Autor U Comic-girl	2	2	2018/01/11T13:00:00+09:00
Shinagawa Title E Autor bei Comic-femail	3	1	2018/01/11T13:00:00+09:00

ranking.json


[{"branch":"Shinjuku","title":"Titel A.","author":"Autor Ahn","genre":"comic-girl","ranking":1,"rate":3,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Shinjuku","title":"Titel B.","author":"Vom Autor","genre":"comic-male","ranking":2,"rate":2,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Shinjuku","title":"Titel C.","author":"Autor U.","genre":"comic-girl","ranking":3,"rate":1,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Marunouchi","title":"Titel C.","author":"Autor U.","genre":"comic-girl","ranking":1,"rate":3,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Marunouchi","title":"Titel A.","author":"Autor Ahn","genre":"comic-girl","ranking":2,"rate":2,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Marunouchi","title":"Titel D.","author":"Autor Kleidung","genre":"comic-boy","ranking":3,"rate":1,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Shinagawa","title":"Titel B.","author":"Vom Autor","genre":"comic-male","ranking":1,"rate":3,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Shinagawa","title":"Titel C.","author":"Autor U.","genre":"comic-girl","ranking":2,"rate":2,"execDate":"2018/01/11T13:00:00+09:00"},{"branch":"Shinagawa","title":"Titel E.","author":"Beim Autor","genre":"comic-femail","ranking":3,"rate":1,"execDate":"2018/01/11T13:00:00+09:00"}]

Bean

Wir werden auch eine entsprechende Rangliste erstellen.

RankingDataBean.java


public class RankingDataBean extends ElsDataBaseBean {

	//Zweigname
	private String branch;
	//Buchtitel
	private String title;
	//Autorenname
	private String author;
	//Genre
	private String genre;
	//Rangfolge
	private int ranking;
	//Bewertung
	private int rate;
	//Registrierungsdatum
	private Date execDate;
	
	(Abkürzung)
}

Die Funktion hier ist, dass es von ElsDataBaseBean erbt. Der Inhalt ist so.

ElsDataBaseBean.java


public class ElsDataBaseBean {
	//Index
	private String index;

	(Abkürzung)
}

Ich habe nur den Index selbst. Wir werden einen Importer erstellen, damit jede Bean, die diese Bean erbt, registriert werden kann.

Importvorgang in ELS

ElsImporter.java


/**
 *Importieren Sie Daten mit Bulk in ELS
 */
public class ElsImporter<T extends ElsDataBaseBean> {

	private static Logger logger = LoggerFactory.getLogger(ElsImporter.class);

	//Indexformat für Jahr / Monat(yyyyMM)
	private static DateTimeFormatter YM_INDEX_FORMATTER;

	//Verschiedene Einstellungsinformationen
	SettingBaseBean setting;

	//Zu importierende Datenklasse
	Class<T> clazz;

	/**
	 *Konstrukteur
	 * @Parametereinstellung Verschiedene Einstellungsinformationen
	 * @param clazz Zu importierende Datenklasse
	 */
	public ElsImporter(SettingBaseBean setting, Class<T> clazz) {
		this.setting = setting;
		this.clazz = clazz;

		YM_INDEX_FORMATTER = DateTimeFormatter.ofPattern(setting.getElasticearch().getIndexYmFormat());
	}

	/**
	 *Import durchführen
	 */
	public boolean execute() throws Exception {

		logger.info("ElsImporter-Importvorgang gestartet-----------------------------------------");

		//Erstellen Sie einen Client für ELS in Java
		// setting.getElasticearch().getAddress():IP Adresse
		// setting.getElasticearch().getPort():Port-Nummer(Normalerweise 9300)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(
						setting.getElasticearch().getAddress()), setting.getElasticearch().getPort()));

		//Massenvorbereitung
		BulkRequestBuilder bulkRequest = client.prepareBulk();

		//Gson Vorbereitung
		// setting.getElasticearch().getExecDateFormat(): 
		//Registrierungsdatum Format(yyyy/MM/dd'T'HH:mm:ss+09:00)
		Gson gson = new GsonBuilder().setDateFormat(setting.getElasticearch().getExecDateFormat()).create();

		//Richten Sie alle Dateien in dem Verzeichnis aus, das JSON enthält
		File dir = new File(setting.getRootDir(), setting.getSubDir().getJsonDir());
		for (File file : dir.listFiles()) {

			logger.debug("■■ Import: "+ file.getName());

			//Konvertieren Sie JSON-Daten in eine Liste
			List<T> list = gson.fromJson(FileUtils.readFileToString(file, "UTF-8"), new ListOfSomething<T>(clazz));

			//Holen Sie sich Ranking-Informationen nacheinander und fügen Sie sie der Masse hinzu
			for (T data : list) {
				//Registrierungszielindex
				// setting.getElasticearch().getIndex():ELS-Index(allgemeiner Teil)
				// setting.getNow():LocalDateTime zum Zeitpunkt der Ausführung der Verarbeitung
				//Beispiel 1: setting.getElasticearch().getIndex()	: ranking
				//      data.getIndex()						: comic-girl
				//      setting.getNow()					: 2018/01/18 12:00:00
				//Index generieren: ranking-comic-girl-201801
				//Beispiel 2: setting.getElasticearch().getIndex()	: ranking
				//      data.getIndex()						: null
				//      setting.getNow()					: 2018/01/18 12:00:00
				//Index generieren: ranking-201801
				String index;
				if (StringUtils.isEmpty(data.getIndex())) {
					//Nicht subindizierte Version
					index = setting.getElasticearch().getIndex()
							+ "-" + YM_INDEX_FORMATTER.format(setting.getNow());
				}
				else {
					//Subindizierte Version
					index = setting.getElasticearch().getIndex()
							+ "-" + data.getIndex()
							+ "-" + YM_INDEX_FORMATTER.format(setting.getNow());
				}
			
				//Hinzufügen von Daten im JSON-Format zu Bulk
				// setting.getElasticearch().getType():ELS-Typ
				bulkRequest.add(client.prepareIndex(index
						, setting.getElasticearch().getType())
					.setSource(gson.toJson(data), XContentType.JSON));
			}
		}

		//Massenausführung
		BulkResponse bulkResponse = bulkRequest.execute().get();

		//Schlägt Bulk aus?(True wenn fehlgeschlagen)
		if (bulkResponse.hasFailures()) {
			logger.error("ElsImporter-Bulk fehlgeschlagen");

			//Beenden Sie den Client
			client.close();

			return false;
		}

		logger.info("ElsImporter-Importvorgang abgeschlossen-----------------------------------------");

		//Beenden Sie den Client
		client.close();

		return true;
	}

	/**
	 *Konvertieren Sie Objekte in der Liste mit Gson in den angegebenen Typ
	 */
	class ListOfSomething<X> implements ParameterizedType {

	    private Class<?> wrapped;

	    public ListOfSomething(Class<X> wrapped) {
	        this.wrapped = wrapped;
	    }

	    public Type[] getActualTypeArguments() {
	        return new Type[] {wrapped};
	    }

	    public Type getRawType() {
	        return List.class;
	    }

	    public Type getOwnerType() {
	        return null;
	    }

	}
}

Referenz: Java Type Generic als Argument für GSON

Die zu importierenden Datenklasseninformationen selbst werden nicht im Importer gespeichert. Da es nur generischen Informationen und Klasseninformationen entspricht, kann es auf andere als diese Ranginformationen umgeleitet werden. elsdatabasebeanHatte inindexWirkt wie ein Subindex. kibanaAnzeigen mitjava-apiIch denke, dass es gut ist, es entsprechend der in erworbenen Granularität zu geben. Die Standard-Granularität des ELS-Index ist logstash. Es ist jedoch eine gute Idee, dies auch zu berücksichtigen, je nachdem, wie lange Sie es häufig versuchen.

exec.java


ElsImporter<RankingDataBean> importer 
	= new ElsImporter<RankingDataBean>(setting, RankingDataBean.class);
boolean result = importer.execute();

Der Anruf wird auf diese Weise getätigt. rankingdatabeanEs ist ein bisschen seltsam, 3 Plätze aufzulisten, aber ich habe aufgegeben, weil es gson unterstützt.

Impressionen

Ich habe mein Bestes getan, um den Importprozess für Massenanfragen so vielseitig wie möglich zu gestalten. Ab dem nächsten Mal möchte ich mich mit diesen registrierten Daten befassen.

Recommended Posts

Verwenden Sie die Elasticsearch Java-API (BulkRequest-Registrierung) [Zusätzliche Hinweise]
Verwenden der Elasticsearch Java-API (Aggregation)