Jak już wspomniałem w komentarzach, to, czego chcesz, nie jest możliwe. Twoje zdanie, w jednym zdaniu, brzmi: czy te same dane zostały przeanalizowane na wiele sposobów, ale przeszukano je jako pojedyncze pole, ponieważ mogłoby to zepsuć istniejącą aplikację.
-- body.html
-- body.email
body field ---- body.content --- all searched as "body"
...
-- body.destination
-- body.whatever
Twoja pierwsza opcja jest multi-pola który ma dokładnie ten cel na uwadze: mają te same dane analizowano wiele sposobów. Problem polega na tym, że nie można wyszukać "body"
i oczekiwać, że ES wyszuka body.html
, body.email
... Nawet jeśli byłoby to możliwe, należy przeszukać za pomocą różnych analizatorów. Ponownie, nie jest to możliwe. Ta opcja wymaga, aby zmienić aplikację i wyszukać każde pole w postaci multi_match
lub .
Twoja druga opcja - reincarnation of multi-fields
- znowu nie działa, ponieważ nie może odnosić się do body
i ES, w tle, aby dopasować mail
, content
itp
Trzecia opcja - wykorzystanie copy_to
- nie będzie działa, ponieważ kopiowanie do innego pola "X" oznacza indeksowanie kopiowanych danych. zostanie przeanalizowane przy użyciu analizatora, a to z kolei spowoduje złamanie wymogu analizy tych samych danych w różny sposób.
Może być jedna czwarta opcja - "path": "just_name"
from multi_fields
- która na pierwszy rzut oka powinna zadziałać. Oznacza to, że możesz mieć 3 multi-pola (e-mail, zawartość, html), które wszystkie trzy mają sub-pole body
. Posiadanie "path": "just_name"
pozwala na wyszukiwanie tylko dla body
, nawet jeśli body
jest podpolem wielu innych pól. Nie jest to jednak możliwe, ponieważ ten typ wielu pól nie przyjmuje różnych analizatorów dla tego samego body
.
Tak czy inaczej, trzeba zmienić coś w swoim wymagań, ponieważ nie będą oni pracować tak, jak chcesz.
To zostało powiedziane, jestem ciekaw co zapytań używasz w swojej aplikacji. Byłaby to prosta zmiana (tak, musisz zmienić swoją aplikację) z pola body
zapytanie na zapytanie body.*
w multi_match
.
Mam dla ciebie jeszcze jedno rozwiązanie: twórz wiele indeksów, jeden indeks dla każdego analizatora twojego body
. Na przykład, dla mail
, content
i html
zdefiniować trzy indeksy:
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"
}
}
}
}
}
Widać, że wszyscy mają taką samą type
i taką samą nazwę pola - body
- ale różne index_analyzer
s. Następnie należy zdefiniować alias:
POST _aliases
{
"actions": [
{"add": {
"index": "multi_fields1",
"alias": "multi"}},
{"add": {
"index": "multi_fields2",
"alias": "multi"}},
{"add": {
"index": "multi_fields3",
"alias": "multi"}}
]
}
Nazwij swój alias tak jak bieżący indeks. Aplikacja nie musi się zmieniać, będzie używać tej samej nazwy do wyszukiwania indeksu, ale ta nazwa nie wskaże indeksu, ale do aliasu, który z kolei odnosi się do wielu wskaźników. Co musi się zmienić sposób indeksowania dokumentów, bo html
dokumenty musi iść w multi_fields1
wskaźnika na przykład dokument email
musi być indeks multi_fields2
indeksu itp
Niezależnie rozwiązanie można znaleźć/wybrać Twoje wymagania potrzebne zmienić, ponieważ sposób, w jaki tego chcesz, nie jest możliwy.
Dlaczego nie indeksować różnych pól, takich jak "mail", "html" itp., Mieć dla każdego inny analizator i użyć kwerendy z wieloma dopasowaniami do wyszukiwania we wszystkich tych polach? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html – Ita
Moim zdaniem te dwa wymagania nie są możliwe razem: "wyszukiwanie w całości pole "body", które będzie przeglądać wszystkie swoje subpola (** aby nie złamać istniejącej aplikacji **) 'i' przeanalizowane trochę inaczej, gdy zostaną zindeksowane i traktowane w ten sam sposób podczas wyszukiwania. Coś musi dać. –
@Ita starsze powody. Istnieje już wiele zapytań na tym polu, więc trudno będzie zastąpić każdy z nich wieloma meczami. – Yuuri