ElasticSearch5.x实践_day05_03_Mapping_Meta-Fields
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
二、Meta-Fields(元數(shù)據(jù))
2.1 _all
_all字段是把其它字段拼接在一起的超級(jí)字段,所有的字段用空格分開(kāi),_all字段會(huì)被解析和索引,但是不存儲(chǔ)。當(dāng)你只想返回包含某個(gè)關(guān)鍵字的文檔但是不明確地搜某個(gè)字段的時(shí)候就需要使用_all字段。
例子:
_all字段包含:[ “Master”, “Java”, “l(fā)earn”, “Tom” ]? 搜索:
POST http://192.168.20.46:9200/my_index/_search?pretty {"query": {"match": {"_all": "Java"}} }使用copy_to自定義_all字段:
PUT http://192.168.20.46:9200/my_index {"mappings": {"mytype": {"properties": {"title": {"type": "text","copy_to": "full_content" },"content": {"type": "text","copy_to": "full_content" },"full_content": {"type": "text"}}}} } POST http://192.168.20.46:9200/my_index/mytype/1 {"title": "Master Java","content": "learn Java" } POST http://192.168.20.46:9200/my_index/_search?pretty {"query": {"match": {"full_content": "java"}} }2.2 _field_names
_field_names字段用來(lái)存儲(chǔ)文檔中的所有非空字段的名字,這個(gè)字段常用于exists查詢(xún)。例子如下:
terms查詢(xún)
POST http://192.168.20.46:9200/my_index/my_type/1 {"title": "This is a document" } POST http://192.168.20.46:9200/my_index/my_type/2 {"title": "This is another document","body": "This document has a body" }POST http://192.168.20.46:9200/my_index/_search {"query": {"terms": {"_field_names": [ "body" ] }} }結(jié)果會(huì)返回第二條文檔,因?yàn)榈谝粭l文檔沒(méi)有title字段。
同樣,可以使用exists查詢(xún):
2.3 _id
每條被索引的文檔都有一個(gè)_type和_id字段,_id可以用于term查詢(xún)、temrs查詢(xún)、match查詢(xún)、query_string查詢(xún)、simple_query_string查詢(xún),但是不能用于聚合、腳本和排序。例子如下:
POST http://192.168.20.46:9200/my_index/my_type/1 {"text": "Document with ID 1" }POST http://192.168.20.46:9200/my_index/my_type/2 {"text": "Document with ID 2" }POST http://192.168.20.46:9200/my_index/_search {"query": {"terms": {"_id": [ "1", "2" ] }} }2.4 _index
多索引查詢(xún)時(shí),有時(shí)候只需要在特地索引名上進(jìn)行查詢(xún),_index字段提供了便利,也就是說(shuō)可以對(duì)索引名進(jìn)行term查詢(xún)、terms查詢(xún)、聚合分析、使用腳本和排序。
_index是一個(gè)虛擬字段,不會(huì)真的加到Lucene索引中,對(duì)_index進(jìn)行term、terms查詢(xún)(也包括match、query_string、simple_query_string),但是不支持prefix、wildcard、regexp和fuzzy查詢(xún)。
舉例,2個(gè)索引2條文檔
http://192.168.20.46:9200/index_1/my_type/1 {"text": "Document in index 1" }http://192.168.20.46:9200/index_2/my_type/2 {"text": "Document in index 2" }POST http://192.168.20.46:9200/index_1,index_2/_search {"query": {"terms": {"_index": ["index_1", "index_2"] }},"aggs": {"indices": {"terms": {"field": "_index", "size": 10}}},"sort": [{"_index": { "order": "asc"}}],"script_fields": {"index_name": {"script": {"lang": "painless","inline": "doc['_index']" }}} } {"took": 1210,"timed_out": false,"_shards": {"total": 10,"successful": 10,"failed": 0},"hits": {"total": 3,"max_score": null,"hits": [{"_index": "index_1","_type": "my_type","_id": "2","_score": null,"fields": {"index_name": ["index_1"]},"sort": ["index_1"]},{"_index": "index_1","_type": "my_type","_id": "1","_score": null,"fields": {"index_name": ["index_1"]},"sort": ["index_1"]},{"_index": "index_2","_type": "my_type","_id": "2","_score": null,"fields": {"index_name": ["index_2"]},"sort": ["index_2"]}]},"aggregations": {"indices": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "index_1","doc_count": 2},{"key": "index_2","doc_count": 1}]}} }?
2.5 _parent
_parent用于指定同一索引中文檔的父子關(guān)系。下面例子中現(xiàn)在mapping中指定文檔的父子關(guān)系,然后索引父文檔,索引子文檔時(shí)指定父id,最后根據(jù)子文檔查詢(xún)父文檔。
POST http://192.168.20.46:9200/my_index {"mappings":{"my_parent":{},"my_child":{"_parent":{"type":{"type":"my_parent"}}}} } POST http://192.168.20.46:9200/my_index/my_parent/1 {"text": "This is a parent document" }POST http://192.168.20.46:9200/my_index/my_child/2?parent=1 {"text": "This is a child document" }POST http://192.168.20.46:9200/my_index/my_child/3?parent=1&refresh=true {"text": "This is another child document" } POST http://192.168.20.46:9200/my_index/my_parent/_search {"query": {"has_child": { "type": "my_child","query": {"match": {"text": "child document"}}}} }?
2.6 _routing
路由參數(shù),ELasticsearch通過(guò)以下公式計(jì)算文檔應(yīng)該分到哪個(gè)分片上:
shard_num = hash(_routing) % num_primary_shards默認(rèn)的_routing值是文檔的_id或者_(dá)parent,通過(guò)_routing參數(shù)可以設(shè)置自定義路由。例如,想把user1發(fā)布的博客存儲(chǔ)到同一個(gè)分片上,索引時(shí)指定routing參數(shù),查詢(xún)時(shí)在指定路由上查詢(xún):
POST http://192.168.20.46:9200/my_index/my_type/1?routing=user1&refresh=true {"title": "This is a document" } GET http://192.168.20.46:9200/my_index/my_type/1?routing=user1 ==> {"_index": "my_index","_type": "my_type","_id": "1","_version": 2,"_routing": "user1","found": true,"_source": {"title": "This is a document"} } POST http://192.168.20.46:9200/my_index/_search {"query": {"terms": {"_routing": [ "user1" ] }} }==> {"took": 33,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 0.2876821,"hits": [{"_index": "my_index","_type": "my_type","_id": "1","_score": 0.2876821,"_routing": "user1","_source": {"title": "This is a document"}}]} } POST http://192.168.20.46:9200/my_index/_search?routing=user1,user2 {"query": {"match": {"title": "document"}} }在Mapping中指定routing為必須的:
PUT http://192.168.20.46:9200/my_index2 {"mappings": {"my_type": {"_routing": {"required": true }}} } POST http://192.168.20.46:9200/my_index2/my_type/1 {"text": "No routing value provided routing_missing_exception" }2.7 _source
存儲(chǔ)的文檔的原始值。默認(rèn)_source字段是開(kāi)啟的,也可以關(guān)閉:
POST http://192.168.20.46:9200/tweets {"mappings": {"tweet": {"_source": {"enabled": false}}} }但是一般情況下不要關(guān)閉,除法你不想做一些操作:
- 使用update、update_by_query、reindex
- 使用高亮
- 數(shù)據(jù)備份、改變mapping、升級(jí)索引
- 通過(guò)原始字段debug查詢(xún)或者聚合
2.8 _type
每條被索引的文檔都有一個(gè)_type和_id字段,可以根據(jù)_type進(jìn)行查詢(xún)、聚合、腳本和排序。例子如下:
POST http://192.168.20.46:9200/my_index/type_1/1 {"text": "Document with type 1" } POST http://192.168.20.46:9200/my_index/type_2/2?refresh=true {"text": "Document with type 2" }POST http://192.168.20.46:9200/my_index/_search {"query": {"terms": {"_type": [ "type_1", "type_2" ] }},"aggs": {"types": {"terms": {"field": "_type", "size": 10}}},"sort": [{"_type": { "order": "desc"}}],"script_fields": {"type": {"script": {"lang": "painless","inline": "doc['_type']" }}} }2.9 _uid
_uid和_type和_index的組合。和_type一樣,可用于查詢(xún)、聚合、腳本和排序。例子如下:
POST http://192.168.20.46:9200/my_index/my_type/1 {"text": "Document with ID 1" } POST http://192.168.20.46:9200/my_index/my_type/2?refresh=true {"text": "Document with ID 2" }POST http://192.168.20.46:9200/my_index/_search {"query": {"terms": {"_uid": [ "my_type#1", "my_type#2" ] }},"aggs": {"UIDs": {"terms": {"field": "_uid", "size": 10}}},"sort": [{"_uid": { "order": "desc"}}],"script_fields": {"UID": {"script": {"lang": "painless","inline": "doc['_uid']" }}} }?
?
?
轉(zhuǎn)載于:https://my.oschina.net/LucasZhu/blog/1491778
總結(jié)
以上是生活随笔為你收集整理的ElasticSearch5.x实践_day05_03_Mapping_Meta-Fields的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [USACO4.2]Drainage D
- 下一篇: 一款炫酷Loading动画--载入成功