1. 程式人生 > >Elasticsearch-2.4.x > Mapping > Meta-fields > _all

Elasticsearch-2.4.x > Mapping > Meta-fields > _all

_all欄位

_all欄位是一個特殊的catch-all欄位.它把其他欄位的值連線成一個大的string,使用空格作為分隔符.然後進行分析和索引,但是不被儲存.這就意味著它可以被搜尋,但是不能取出,高亮.
_all欄位允許查詢文件值但不知道哪個欄位包含的值.這對開始使用新的資料集的時候是有用的.例如:

PUT my_index/user/1                                                           (1)
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth"
: "1970-10-24" } GET my_index/_search { "query": { "match": { "_all": "john smith 1970" } } }

(1) 這個_all欄位包含的term[“john”,”smith,”1970”,”10”,”24”]

note : 所有值都被視為string
date_of_birth 欄位在上述的例子中被指定為date型別的欄位並且索引為一個表示1970-10-24 00:00:00 UTC的單一term.因為_all視所有值為string,所以該欄位值會被索引為三個term [“1970”,”24”,”10”]
更要注意的是:_all欄位將每個欄位的原始值組合成為string,而沒有把每個欄位的term合併起來.

_all欄位是一個string field,並接受其他string欄位接受的相同引數. 包含 : analzyer , term_vectors , index_options and store.
_all欄位需要額外的cpu週期和更多的磁碟空間.如果不需要的話,可以完全禁用或者自定義_all欄位

使用_all欄位查詢

query_string and simple_query_string查詢預設都是針對_all欄位.除非指定了另一個欄位

GET _search
{
  "query": {
    "query_string": {
      "query": "john smith 1970"
} } }

其他的查詢,比如 match 和 term 查詢你需要顯示的指定_all欄位,根據上述第一個例子

禁用_all欄位

每個型別通過設定enabled:false將_all欄位完全禁用

PUT my_index
{
  "mappings": {
    "type_1": {                                                                    (1)
      "properties": {...}
    },
    "type_2": {                                                                    (2)
      "_all": {
        "enabled": false
      },
      "properties": {...}
    }
  }
}

(1) type_1的_all是啟用的
(2) type_2的_all是完全禁用的

如果_all欄位是禁用的,query_string and simple_query_string將不能用於查詢.你可以將它們配置為使用不同的欄位 index.query.default_field setting:

PUT my_index
{
  "mappings": {
    "my_type": {
      "_all": {
        "enabled": false                                                                 (1)
      },
      "properties": {
        "content": {
          "type": "string"
        }
      }
    }
  },
  "settings": {
    "index.query.default_field": "content"                                               (2)
  },
}

(1) my_type型別_all欄位是禁用的
(2) query_string預設查詢content欄位

從_all欄位中排除欄位

可以使用include_in_all設定從_all欄位包含或者排除的單獨欄位

index boosting和_all欄位

單個欄位可以在索引的時候提高權重,使用boost引數._all欄位考慮了這些提升.

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "title": {                                                                        (1)
          "type": "string",
          "boost": 2
        },
        "content": {                                                                      (2)
          "type": "string"
        }
      }
    }
  }
}

(1) 當查詢_all欄位的時候,title欄位的詞的相關性會是後者的兩倍
(2) content欄位的詞

warning: 在_all欄位中使用 index-time boosting對查詢效能有顯著的影響.通常更好的解決方案是單獨查詢欄位.

自定義_all欄位

雖然一個索引只有一個all欄位,但是copy_to引數允許建立多個自定義_all欄位.例如:first_name and last_name合併到full_name

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "first_name": {
          "type":    "string",
          "copy_to": "full_name"                                     (1)
        },
        "last_name": {
          "type":    "string",
          "copy_to": "full_name"                                     (2)
        },
        "full_name": {
          "type":    "string"
        }
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET myindex/_search
{
  "query": {
    "match": {
      "full_name": "John Smith"
    }
  }
}

(1) first_name 和 last_name值被copy到full_name欄位.
(2)

高亮和_all欄位

如果一個string值是可以獲得的,那麼這個欄位就可以被高亮顯示.要麼來自_source欄位,要麼是一個儲存欄位.
_all欄位不在_source欄位中,預設情況下不儲存.所以不能用於高亮顯示.有兩個選項:要麼儲存_all欄位,要麼高亮原始欄位.

儲存_all欄位

如果store設定為true,則可以取出_all原始欄位並高亮顯示.

PUT myindex
{
  "mappings": {
    "mytype": {
      "_all": {
        "store": true
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET _search
{
  "query": {
    "match": {
      "_all": "John Smith"
    }
  },
  "highlight": {
    "fields": {
      "_all": {}
    }
  }
}

當然,儲存_all欄位將會佔用更多的磁碟空間.因為它是其他欄位的組合,所以可能會導致奇怪的高亮結果.
_all欄位也接受term_vector和index_options引數,允許使用fast vector highlighter和postings highlighter.

高亮原始欄位

你可以查詢_all欄位,但是使用原始欄位高亮:

PUT myindex
{
  "mappings": {
    "mytype": {
      "_all": {}
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET _search
{
  "query": {
    "match": {
      "_all": "John Smith"                                                                      (1)
    }
  },
  "highlight": {
    "fields": {
      "*_name": {                                                                               (2)
        "require_field_match": "false"                                                          (3)
      }
    }
  }
}

(1) 查詢檢查_all欄位找到匹配的文件
(2) 高亮是在兩個name欄位上執行的,它們可以從_source欄位獲取
(3) 查詢沒有針對name欄位進行,所以將require_field_match設定為false.