2015-06-19 83 views
8

我使用嚴格的預定義映射將不同類型的文檔存儲在單個索引中。他們都有一些領域(比如說「body」),但是我希望他們在索引時稍有不同(例如,爲特定文檔使用不同的標記過濾器),並在搜索時以相同的方式進行處理。據我所知,分析器不能在每個文件中指定。Elasticsearch單個字段的多個分析器

我也考慮使用:

  1. 對象字段與不同的分析文件類型的子域,所以每個文件只有一個充滿子(如,「body.mail」,「body.html」) 。問題在於,我無法搜索整個「身體」字段,這個字段會查看其所有子字段(不打破現有應用程序)。
  2. 多領域的新轉世(有一個通用分析器的「身體」領域和custonly分析「mail」,「html」等)。 Hovewer,我不確定是否有可能在索引時直接使用它們,並在搜索時間接使用它們(例如,使用{"mail":"smth"}保存對象以使用特定索引分析器,然後通過"query":{"body":"smth"}搜索以使用通用搜索分析器)。
  3. 要將「正文」分成幾個不同映射的字段,請從_all中刪除它們,並將copy_to設置爲單個body字段。我不確定,但由於複製,它會增加大量的索引開銷。
+2

爲什麼不索引不同的領域,如「郵件」,「HTML」等,有不同的分析器爲每個,並使用多個匹配查詢來搜索所有這些領域? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html – Ita

+0

在我看來,這兩個要求是不可能在一起的:「大體上搜索「body」字段可以查看其所有子字段(**不會破壞現有的應用程序**),並且「在搜索時以相同的方式進行索引和處理時稍有不同」。有些事情要付出。 –

+0

@ Ita遺留的原因。目前已經有很多關於該領域的搜索查詢,所以這很難,而且樣板傾向於用多個匹配替換每個搜索。 – Yuuri

回答

13

正如我在評論中提到的,你想要什麼是不可能的。用一句話來說,您的要求是:以多種方式分析相同的數據,但作爲單個字段進行搜索,因爲這會破壞現有的應用程序。

   -- body.html   
      -- body.email 
body field ---- body.content  --- all searched as "body" 
      ... 
      -- body.destination 
      -- body.whatever 
  • 你的第一個選項是多領域其心中都有這個確切的目的:具有相同的數據分析的多種方式。問題是,您不能搜索"body"並期望ES搜索body.html,body.email ...即使這可能,您也希望使用不同的分析儀進行搜索。再次,不可能。此選項要求您更改應用程序並搜索multi_matchquery_string中的每個字段。

  • 你的第二個選項 - reincarnation of multi-fields - 將再次無法工作,因爲你不能指body和ES,在後臺,以匹配mailcontent

  • 第三種選擇 - 使用copy_to - 不會因爲複製到另一個字段「X」意味着索引被複制的數據將使用X的分析儀進行分析,並且這會打破您對以不同方式分析相同數據的要求。

  • 可能有第四個選項 - "path": "just_name" from multi_fields - 它在第一眼看起來應該工作。意思是,你可以有3個多字段(電子郵件,內容,html),這三個字段都有一個body子字段。擁有"path": "just_name"即使body是多個其他字段的子字段,也允許您僅搜索body。但這是不可能的,因爲這種類型的多字段不會接受用於相同的body的不同分析器。

無論哪種方式,您需要更改您的要求的東西,因爲他們不會你想要的方式它的工作他們。


這些雖這麼說,我很好奇,看看你在你的應用程序中使用哪些查詢。這將是一個簡單的變化(是的,你將需要更改你的應用)從查詢body字段到查詢body.*multi_match

我還有另一個解決方案:創建多個索引,每個分析器的索引號爲body。例如,對於mailcontenthtml定義三個指標:

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指數等

你找到什麼解決方案/選擇,你的要求需要改變,因爲你想要的方式是不可能的。

3

我想你可以使用多字段。使用多字段,您可以爲每個子字段定義分析器(索引&搜索),並根據應用程序要求在相應的字段上執行搜索。 一般來說,索引分析器可能會因字段而異,對於搜索分析器也是如此。

 
{ 
    "your_type" : { 
    "properties":{ 
     "body" : { 
      "type" : "string", 
      "index" : "analyzed", 
      "index_analyzer" : "index_body_analyzer", 
      "search_analyzer" : "search_body_analyzer", 
      "fields" : { 
       "mail" : { 
        "type" : "string", 
        "index" : "analyzed", 
        "index_analyzer" : "index_bodymail_analyzer", 
        "search_analyzer" : "search_bodymail_analyzer" 
       }, 
       "html": { 
        "type" : "string",    
        "index" : "analyzed", 
        "index_analyzer" : "index_bodyhtml_analyzer", 
        "search_analyzer" : "search_bodyhtml_analyzer" 
       } 
      } 
     } 
    } 
}
+0

是否可以將數據索引到「html」字段(使用其index_analyzer),然後在'body'字段(使用其search_analyzer)進行搜索?後者對於向後兼容至關重要。 – Yuuri

+0

您是否將索引差異數據轉換爲'html'?或與'body'相同的數據,只是在index_analyzer中的區別?如果相同的數據,ES已經通過多字段定義爲您做了相同的數據。您可以提供有關問題的示例數據以清楚地說明問題。 –

+0

我的意思是索引對象,如'[{「id」:1,「html」:「...」},{「id」:2,「mail」:「...」}]'(或'「 body.html「:」...「等)使用不同的索引分析器,而是像'」query「:」body:smth「'一樣使用單個搜索分析器進行搜索。 我目前正在試驗映射,但仍然無法使我的舊搜索界面(在查詢中使用'body')工作。 – Yuuri

相關問題