Wie ich in den Kommentaren erwähnt, was Sie wollen, ist nicht möglich. Ihre Anforderung in einem Satz lautet: Lassen Sie dieselben Daten auf verschiedene Arten analysieren, suchen Sie aber als einzelnes Feld, da dies die bestehende Anwendung durchbrechen würde.
-- body.html
-- body.email
body field ---- body.content --- all searched as "body"
...
-- body.destination
-- body.whatever
Ihre erste Option ist Multi-Felder, die genau dieses Ziel vor Augen hat: haben die gleichen Daten mehrere Möglichkeiten analysiert. Das Problem ist, dass Sie nicht nach "body"
suchen können und erwarten, dass ES body.html
, body.email
... sucht. Auch wenn dies möglich wäre, möchten Sie mit verschiedenen Analysatoren gesucht werden. Nochmal nicht möglich. Diese Option erfordert, dass Sie die Anwendung ändern und nach jedem Feld in einer multi_match
oder in einer query_string
suchen.
Die zweite Möglichkeit - reincarnation of multi-fields
- wieder nicht funktionieren, weil Sie nicht zu body
und ES, im Hintergrund verweisen können, mail
übereinstimmen, content
usw.
dritte Option - copy_to
mit - wird nicht arbeiten, weil das Kopieren in ein anderes Feld "X" bedeutet Indexierung der Daten kopiert wird analysiert mit X
Analysator, und dies bricht Ihre Anforderung, die gleichen Daten unterschiedlich analysiert werden.
Es könnte eine vierte Option geben - "path": "just_name"
from multi_fields
- die auf den ersten Blick sollte es funktionieren. Das heißt, Sie können 3 Multi-Felder (E-Mail, Inhalt, HTML) haben, 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 anderen Analysatoren für denselben body
akzeptiert.
So oder so, müssen Sie etwas in Ihren Anforderungen ändern, weil sie sie nicht so funktionieren Sie es wollen.
Diese wird gesagt, ich bin gespannt zu sehen, welche Anfragen sind Sie in Ihrer Anwendung verwenden. Es wäre eine einfache Änderung (ja, Sie müssen Ihre App ändern) von der Abfrage body
Feld zur Abfrage body.*
in einer multi_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ür mail
, content
und html
Sie definieren drei Indizes:
PUT /multi_fields1
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "whitespace",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields2
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "standard",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields3
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "keyword",
"search_analyzer": "standard"
}
}
}
}
}
Sie sehen, dass alle von ihnen type
und den gleichen Feldnamen die gleiche haben - body
- aber unterschiedliche index_analyzer
s. Dann definieren Sie einen Alias:
POST _aliases
{
"actions": [
{"add": {
"index": "multi_fields1",
"alias": "multi"}},
{"add": {
"index": "multi_fields2",
"alias": "multi"}},
{"add": {
"index": "multi_fields3",
"alias": "multi"}}
]
}
Benennen Sie Ihren Alias den gleichen wie Ihren 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 sich wiederum auf Ihre Mehrfachindizes bezieht. Was muss sich ändern, wie Sie Index ist die Dokumente, weil ein html
Dokumente zum Beispiel in multi_fields1
Index gehen muss, muss ein email
Dokument Index in multi_fields2
Index sein usw.
Was auch immer Sie Lösung finden/wählen, Ihre Anforderungen benötigen ändern, weil die Art, wie Sie es wollen, nicht möglich ist.
Warum indexieren Sie nicht verschiedene Felder wie "mail", "html" usw., haben jeweils einen anderen Analyzer und verwenden eine Multi-Match-Abfrage, um alle diese Felder zu suchen? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html – Ita
Meiner Meinung nach sind diese beiden Anforderungen nicht zusammen möglich: 'Suche im Großen und Ganzen "body" -Feld, das durch alle seine Unterfelder schauen würde (** um die existierende Anwendung nicht zu brechen **) 'und' leicht anders analysiert, wenn indexiert und auf die gleiche Weise behandelt wird, während gesucht wird '. Etwas muss geben. –
@Ita Legacy Gründe. Es gibt bereits viele Suchanfragen zu diesem Feld, so dass es schwierig und anspruchsbasiert wäre, jedes mit mehreren Übereinstimmungen zu ersetzen. – Yuuri