2017-10-21 46 views

回答

1

您粘貼在前一段落給出了一些說明:

在上面例子中的字段DATE_OF_BIRTH被識別爲一個日期字段,因此將索引表示1970年10月24日00的單個術語: 00 UTC。然而,_all字段將所有值視爲字符串,因此日期值被索引爲三個字符串項:「1970」,「24」,「10」。

換句話說,所述_all字段從索引文件採用原始值和運行它們通過自身分析器,產生其自己的術語,其然後被存儲在索引中。它不使用其他領域的分析儀生產的terms

上面貼上的段落給出了一個例子。它解釋date_of_birth字段將被識別爲date類型,因此將分析字段值並將其存儲爲單個字段1970-10-24 00:00:00 UTC。所以,如果你會嘗試將date_of_birth場與match這樣的查詢匹配:

{ "query": { "match: { "date_of_birth": "24 10" } } } 

你不會找到該文件,因爲解析器將無法解析所提供的價值爲日期。

在另一方面,如果你將運行在_all場相同的查詢,你一定會發現,文檔:

{ "query": { "match: { "_all": "24 10" } } } 

因爲作爲文檔建議,在_all領域將包括以下text類型條款:["1970", "10", "24"]

我們來看另一個例子。假設你有以下user類型的mapping

"user": { 
    "properties": { 
     "nickname": { "type": "keyword" }, 
     "name": { "type": "text" }, 
     "age": { "type": "integer" } 
    } 
} 

你指數下列文件:

{ 
    "nickname": "Super-Man", 
    "name": "John", 
    "age": 25 
} 

Elasticsearch將根據其類型分析這個文檔的領域,最終存儲每個下列條款

  • _all:這些領域的["super", "man", "john", "25"] - 所有字符串
  • nickname["Super-Man"]
  • name["john"]
  • age[25] - 整數

因此,如果您將設法找到使用該文檔match(或term)查詢,其中nickname等於super你不會找到它。由於nickname字段被分析爲keyword,因此您必須使用確切的字符串來查找它 - "Super-Man"

但是,如果您嘗試使用match查詢找到此文檔,其中_all等於super,您會發現它。另一方面,如果您嘗試使用對_all字段的整數值25term查詢來查找此文檔,您將找不到它。同樣,因爲_all場只是一個text場:

{ "query": { term": { "_all": 25} } } 

但其上運行的age場相同的查詢將返回文檔:

{ "query": { term": { "age": 25} } } 
+0

感謝@smnh,極通的解釋。 。只是一個簡單的問題:你認爲_all也可以與multi_match和類型短語一起使用嗎?我只是想知道,如果我正在尋找一個確切的短語_all可以使用 –

+0

是的,你可以使用'_all'字段與'multi_match'的短語類型。但請記住,它將根據您匹配的字段以不同方式分析搜索到的短語。例如,對於_all字段,它將用空格拆分該短語,而對於'multi_match.fields'中指定的另一個字段,它將使用爲該字段指定的分析器。它也可能匹配兩個不同領域的短語。例如,如果你在_all字段上標記'{「name」:「Bob」,「tag」:「world」}'然後嘗試匹配一個短語「bob world」,你可能會發現你的文檔,儘管這個短語是來自兩個領域。 – smnh

相關問題