正如我在評論中提到的,你想要什麼是不可能的。用一句話來說,您的要求是:以多種方式分析相同的數據,但作爲單個字段進行搜索,因爲這會破壞現有的應用程序。
-- body.html
-- body.email
body field ---- body.content --- all searched as "body"
...
-- body.destination
-- body.whatever
你的第一個選項是多領域其心中都有這個確切的目的:具有相同的數據分析的多種方式。問題是,您不能搜索"body"
並期望ES搜索body.html
,body.email
...即使這可能,您也希望使用不同的分析儀進行搜索。再次,不可能。此選項要求您更改應用程序並搜索multi_match
或query_string
中的每個字段。
你的第二個選項 - reincarnation of multi-fields
- 將再次無法工作,因爲你不能指body
和ES,在後臺,以匹配mail
,content
等
第三種選擇 - 使用copy_to
- 不會因爲複製到另一個字段「X」意味着索引被複制的數據將使用X
的分析儀進行分析,並且這會打破您對以不同方式分析相同數據的要求。
可能有第四個選項 - "path": "just_name"
from multi_fields
- 它在第一眼看起來應該工作。意思是,你可以有3個多字段(電子郵件,內容,html),這三個字段都有一個body
子字段。擁有"path": "just_name"
即使body
是多個其他字段的子字段,也允許您僅搜索body
。但這是不可能的,因爲這種類型的多字段不會接受用於相同的body
的不同分析器。
無論哪種方式,您需要更改您的要求的東西,因爲他們不會你想要的方式它的工作他們。
這些雖這麼說,我很好奇,看看你在你的應用程序中使用哪些查詢。這將是一個簡單的變化(是的,你將需要更改你的應用)從查詢body
字段到查詢body.*
在multi_match
。
我還有另一個解決方案:創建多個索引,每個分析器的索引號爲body
。例如,對於mail
,content
和html
定義三個指標:
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"
}
}
}
}
}
你看,他們都具有相同的type
和相同的字段名稱 - body
- 但不同index_analyzer
秒。然後你定義一個別名:
POST _aliases
{
"actions": [
{"add": {
"index": "multi_fields1",
"alias": "multi"}},
{"add": {
"index": "multi_fields2",
"alias": "multi"}},
{"add": {
"index": "multi_fields3",
"alias": "multi"}}
]
}
命名你的別名與你當前的索引相同。應用程序不需要更改,它將使用相同的名稱進行索引搜索,但此名稱不會指向索引,而是指向別名,該別名又指您的多個索引。有什麼需要改變的是你如何索引的文件,因爲文件html
需要multi_fields1
指數例如去,一個email
文件必須是指數multi_fields2
指數等
你找到什麼解決方案/選擇,你的要求需要改變,因爲你想要的方式是不可能的。
爲什麼不索引不同的領域,如「郵件」,「HTML」等,有不同的分析器爲每個,並使用多個匹配查詢來搜索所有這些領域? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html – Ita
在我看來,這兩個要求是不可能在一起的:「大體上搜索「body」字段可以查看其所有子字段(**不會破壞現有的應用程序**),並且「在搜索時以相同的方式進行索引和處理時稍有不同」。有些事情要付出。 –
@ Ita遺留的原因。目前已經有很多關於該領域的搜索查詢,所以這很難,而且樣板傾向於用多個匹配替換每個搜索。 – Yuuri