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:
{"mail":"smth"}
zu speichern, um einen bestimmten Indexanalysator zu verwenden, dann nach "query":{"body":"smth"}
, um den generischen Suchanalysator zu verwenden). _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. 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:
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:
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.
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%Tags und Links indexing elasticsearch