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.