Elasticsearch mehrere Analysatoren für ein einzelnes Feld
Ich speichern verschiedener Arten von Dokumenten in einem einzigen index mit strengen vordefinierten mapping. Alle von Ihnen haben einige Feld (sagen wir, "Körper"), aber ich würde wollen, dass Sie analysiert werden geringfügig anders, wenn indiziert (z.B. die Verwendung verschiedener token Filter für bestimmte Dokumente) und Produkte verwendet und diese der gleichen Weise, während Sie suchte. Soweit ich weiß, Analysatoren können nicht angegeben werden, die pro Dokument.
Was ich auch überlegt:
- Objekt-Felder mit unterschiedlich analysiert Unterfelder für Dokument-Arten, so dass jedes Dokument hat nur eine gefüllt Unterfeld (wie "Körper.E-mail", "body.html"). Das problem ist, dass ich nicht die Suche auf das ganze "body" - Feld, die Aussehen würde, und durch alle seine Unterfelder (um nicht zu brechen die bestehende Applikation).
- Neue Reinkarnation von multi-Feldern (zu haben "body" - Feld mit einem generic-analyzer und custonly analysiert "E-mail", "html", etc. im inneren). Hovewer, ich bin mir nicht sicher, ob es möglich ist, um Sie direkt zu benutzen, während die Indizierung und indirekt während der Suche (z.B.,, Objekt speichern, mit
{"mail":"smth"}
für die Verwendung eines bestimmten index analyzer, dann Suche"query":{"body":"smth"}
zu verwenden, Generika-Suche-analyzer). - Zu trennen "Körper" in mehrere Felder mit unterschiedlichen Zuordnungen, entfernen Sie Sie aus
_all
, und legen Siecopy_to
zu einem einzigenbody
Feld. Ich bin mir nicht sicher, aber es wird eine wesentliche index-overhead durch kopieren.
- Warum nicht in Ihren index auf verschiedene Felder wie "E-mail", "html" etc. sind in einem anderen analyzer für jeden, und ein multi-match-Abfrage zur Suche auf allen diesen Gebieten? elastisch.co/guide/de/elasticsearch/Referenz/current/...
- Meiner Meinung nach, diese beiden Anforderungen sind nicht möglich zusammen:
search on the whole "body" field which would look through all its subfields (**to not break the existing application**)
undanalyzed slightly differently when indexed and treaten the same way while searched
. Etwas hat zu geben. - Legacy-Gründen. Es gibt eine Menge von Suchanfragen auf diesem Gebiet bereits, so dass es schwer werden würde und boilerplate-anfällig zu ersetzen, jeder mit multi-match.
- "
copy_to
zu einem einzigenbody
Feld" verwenden Sie den analyzer für diebody
Feld also, auch wenn Sie hatten verschiedene Analysatoren, die auf die Felder, diecopy_to
am Ende innenbody
erhalten Sie text analysiert, indem diebody
field analyzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ich erwähnte in den Kommentaren, was Sie wollen, ist nicht möglich. Ihre Forderung, in einem Satz, ist: haben die dieselben Daten analysiert, die in mehreren Möglichkeiten, aber gesucht werden, wie ein einzelnes Feld, weil dieses brechen der bestehenden Anwendung.
Ihre erste option ist multi-Felder, die hat genau dieses Ziel vor Augen: die gleichen Daten analysiert mehrere Möglichkeiten. Das problem ist, dass Sie nicht suchen
"body"
- und erwarten, ES zu suchenbody.html
,body.email
... Selbst wenn dies möglich wäre, Sie wollen gesucht werden, mit anderen Analysatoren. Wieder, nicht möglich. Diese option erfordert, dass Sie ändern Sie die Anwendung und Suche für jedes Feld in einermulti_match
oder in einemquery_string
.Ihre zweite option -
reincarnation of multi-fields
- wird wieder nicht funktionieren, weil Sie nicht findenbody
und ES, im hintergrund zu entsprechenmail
,content
etc.Dritte option - mit
copy_to
- wird nicht funktionieren, weil das kopieren auf ein anderes Feld ein "X" bedeutet, dass die Indizierung der Daten, die kopiert werden werden analysiert, mitX
's analyzer, und dieser bricht Ihrer Anforderung mit den gleichen Daten analysiert anders.Könnte es eine vierte option -
"path": "just_name"
vonmulti_fields
- was auf den ersten Blick sollte es funktionieren. Das bedeutet, Sie können 3 multi-Felder (E-Mail, Inhalt, html), die alle drei einebody
sub-Bereich. Mit"path": "just_name"
können Sie die Suche nur fürbody
auch wennbody
ist ein sub-Bereich von mehreren anderen Bereichen. Dies ist aber nicht möglich, weil diese Art von multi-Feldern nicht akzeptieren, unterschiedliche Analysatoren für die gleichenbody
.So oder so, Sie müssen etwas verändern in Ihren Anforderungen, da Sie nicht die Arbeit, die Sie, wie Sie es wollen.
Dieser sagte, ich bin neugierig, zu sehen, welche Abfragen verwenden Sie in Ihrer Anwendung. Es wäre eine einfache änderung (ja, werden Sie brauchen, um Ihre app) Abfragen
body
Feld Abfragenbody.*
immulti_match
.Und ich habe eine andere Lösung für Sie: erstellen Sie mehrere Indizes, einen index für jeden Analysator Ihrer
body
. Zum Beispiel, fürmail
,content
undhtml
definieren Sie drei Indizes:Sehen Sie, dass alle von Ihnen haben die gleichen
type
und die gleichen Feldnamen -body
- aber andersindex_analyzer
s. Dann definieren Sie einen alias:Namen Ihren alias die gleiche wie Ihre aktuellen index. Die Anwendung nicht ändern müssen, verwenden die gleichen Namen für die index-Suche, aber dieser name wird nicht auf einen index, sondern auf einen alias, die wiederum bezieht sich auf Ihr mehrere Indizes. Was sich ändern muss ist, wie Sie die Indexierung der Dokumente, da ein
html
Dokumente braucht, um zu gehen inmulti_fields1
index zum Beispiel, einemail
Dokument-index inmulti_fields2
index etc.Welche Lösung auch immer Sie finden/wählen, die Ihre Anforderungen ändern müssen, weil die Art und Weise, die Sie wollen, ist es nicht möglich.
Ich denke, Sie können multi-Feld. Mit multi-Feld können Sie definieren Analysatoren (beide Indizierung & suchen) für jede sub-Felder, und führen Sie die Suche auf die entsprechenden Felder auf Basis Anwendungen Anforderungen.
Im Allgemeinen, index-Analysator Unterschied von Feld zu Feld, dabei für search-analyzer.
html
Feld (mit seinen index_analyzer), dann führen Sie die Suche aufbody
Feld (mit seinen search_analyzer)? Letzteres ist entscheidend für die Abwärtskompatibilität.html
? oder die gleichen Daten mitbody
, nur Unterschied im index_analyzer ? Wenn die gleichen Daten, dann ist ES schon Tat es für Sie durch multi-Feld-Definitionen. Sie können sample-Daten auf die Frage, um die Dinge klar.[{"id":1,"html":"..."},{"id":2,"mail":"..."}]
(oder"body.html":"..."
usw.) der Einsatz von verschiedenen index-Analysatoren, sondern zu suchen, wie"query":"body:smth"
für die Verwendung von single-Suche analyzer. Ich bin derzeit Experimentieren mit den Zuordnungen, aber kann immer noch nicht meinen alten Suche-Schnittstelle (verwendetbody
in Abfragen) zu arbeiten.