Elasticsearch mehrere Analysatoren für ein einzelnes Feld

8

Ich speichere verschiedene Arten von Dokumenten in einem einzigen Index mit einer streng vordefinierten Zuordnung. Alle haben ein Feld (etwa "body"), aber ich möchte, dass sie bei der Indizierung etwas anders analysiert werden (zum Beispiel um verschiedene Token-Filter für bestimmte Dokumente zu verwenden) und auf dieselbe Weise behandelt werden, während sie gesucht werden. Soweit ich weiß, können Analysatoren nicht pro Dokument spezifiziert werden.

Was ich auch in Betracht gezogen habe:

  1. Objektfelder mit unterschiedlich analysierten Teilfeldern für Dokumentarten, so dass jedes Dokument nur ein gefülltes Teilfeld hat (zB "body.mail", "body.html"). Das Problem ist, dass ich nicht das gesamte Feld "body" durchsuchen konnte, das alle seine Unterfelder durchschaute (um die bestehende Anwendung nicht zu unterbrechen).
  2. Neue Reinkarnation von Multi-Feldern (um "Körper" -Feld mit einem generischen Analysator zu haben und "e-Mail", "html" usw. darin analysiert zu haben). Hovewer, ich bin mir nicht sicher, ob es möglich ist, sie direkt während der Indizierung und indirekt während der Suche zu verwenden (zB um Objekte mit {"mail":"smth"} zu speichern, um einen bestimmten Indexanalysator zu verwenden, dann nach "query":{"body":"smth"} , um den generischen Suchanalysator zu verwenden).
  3. Um "body" in mehrere Felder mit unterschiedlichen Zuordnungen zu trennen, entfernen Sie sie aus _all und setzen Sie copy_to auf ein einzelnes body -Feld. Ich bin mir nicht sicher, aber es wird einen erheblichen Index-Overhead aufgrund von Kopieren hinzufügen.
Yuuri 19.06.2015, 16:40
quelle

2 Antworten

13

Wie ich in den Kommentaren erwähnt habe, ist das, was Sie wollen, nicht möglich. Ihre Anforderung in einem Satz lautet: Lassen Sie dieselben Daten auf mehrere Arten analysieren, suchen Sie aber als einzelnes Feld, da dies die bestehende Anwendung durchbrechen würde.

%Vor%
  • Ihre erste Option ist multi-fields , die genau diesen Zweck erfüllt: Sie müssen die gleichen Daten mehrfach analysieren. Das Problem ist, dass Sie nicht nach "body" suchen können und erwarten, dass ES nach body.html , body.email ... sucht. Auch wenn dies möglich wäre, möchten Sie mit verschiedenen Analysatoren gesucht werden. Nochmal nicht möglich. Für diese Option müssen Sie die Anwendung ändern und nach jedem Feld in einem multi_match oder in einem query_string suchen.

  • Ihre zweite Option - reincarnation of multi-fields - wird wieder nicht funktionieren, weil Sie nicht auf body und ES im Hintergrund verweisen können, um mail , content usw .

  • Die dritte Option - copy_to verwenden - funktioniert nicht, weil das Kopieren in ein anderes Feld "X" bedeutet, dass die kopierten Daten indexiert werden. wird mit dem Analysator X analysiert Dies bricht Ihre Anforderung, die gleichen Daten unterschiedlich zu analysieren.

  • Es könnte eine vierte Option geben - "path": "just_name" from multi_fields - auf den ersten Blick sollte es funktionieren. Das heißt, Sie können 3 Multi-Felder haben (E-Mail, Inhalt, HTML), die alle drei ein body Unterfeld haben. Mit "path": "just_name" können Sie nur nach body suchen, auch wenn body ein Unterfeld mehrerer anderer Felder ist. Dies ist jedoch nicht möglich, da diese Art von Mehrfachfeldern keine unterschiedlichen Analysatoren für dieselbe body akzeptiert.

In jedem Fall müssen Sie etwas an Ihren Anforderungen ändern, da sie nicht so funktionieren, wie Sie es möchten.

Nachdem ich das gesagt habe, bin ich gespannt, welche Anfragen Sie in Ihrer Anwendung verwenden. Es wäre eine einfache Änderung ( ja, Sie müssen Ihre App ändern), indem Sie das Feld body an body.* in multi_match abfragen.

Und ich habe eine andere Lösung für Sie: Erstellen Sie mehrere Indizes, einen Index für jeden Analysator Ihrer body . Zum Beispiel definieren Sie für mail , content und html drei Indizes:

%Vor%

Sie sehen, dass alle von ihnen die gleiche type und den gleichen Feldnamen - body - aber unterschiedliche index_analyzer s haben. Dann definieren Sie einen Alias:

%Vor%

Benenne deinen Alias ​​genauso wie deinen aktuellen Index. Die Anwendung muss nicht geändert werden, sie verwendet denselben Namen für die Indexsuche, aber Dieser Name verweist nicht auf einen Index, sondern auf einen Alias, der wiederum auf Ihre mehreren Indizes verweist. Was Sie ändern müssen, ist, wie Sie die Dokumente indizieren, weil ein html -Dokumente zum Beispiel in multi_fields1 index gehen muss, ein email -Dokument muss in multi_fields2 index usw. indexiert sein.

Welche Lösung Sie auch finden / wählen, Ihre Anforderungen müssen sich ändern, da die von Ihnen gewünschte Lösung nicht möglich ist.

    
Andrei Stefan 26.06.2015, 06:35
quelle
3

Ich denke, dass Sie Multi-Feld verwenden können. Mit einem Multi-Feld können Sie Analysatoren (sowohl Indexierung als auch Suche) für jedes Teilfeld definieren und die Suche nach entsprechenden Feldern basierend auf den Anforderungen der Anwendung durchführen. Im Allgemeinen kann der Indexanalysator von Feld zu Feld unterschiedlich sein, das gleiche gilt für den Suchanalysator.

%Vor%     
Duc.Duong 22.06.2015 07:02
quelle

Tags und Links