前言
上一小节中,根据dynamic
的状态不同,我们对字段有了更多可自定义的操作。现在再来补充一个参数,使自定义的属性更加的灵活。
index
首先来创建一个mappings:
PUT m4 { "mappings": { "doc": { "dynamic": false, "properties": { "name": { "type": "text", "index": true }, "age": { "type": "long", "index": false } } } } }
我们在创建索引的时候,为每个属性添加一个index
参数
先来添加一篇文档
PUT m4/doc/1 { "name": "小黑", "age": 18 }
再来查询看效果
GET m4/doc/_search { "query": { "match": { "name": "小黑" } } } GET m4/doc/_search { "query": { "match": { "age": 18 } } }
以name
查询没问题,但是,以age
作为查询条件就有问题了
{ "error": { "root_cause": [ { "type": "query_shard_exception", "reason": "failed to create query: {\n \"match\" : {\n \"age\" : {\n \"query\" : 18,\n \"operator\" : \"OR\",\n \"prefix_length\" : 0,\n \"max_expansions\" : 50,\n \"fuzzy_transpositions\" : true,\n \"lenient\" : false,\n \"zero_terms_query\" : \"NONE\",\n \"auto_generate_synonyms_phrase_query\" : true,\n \"boost\" : 1.0\n }\n }\n}", "index_uuid": "GHBPeT5pRnSi3g6DkpIkow", "index": "m4" } ], "type": "search_phase_execution_exception", "reason": "all shards failed", "phase": "query", "grouped": true, "failed_shards": [ { "shard": 0, "index": "m4", "node": "dhkqLLTsRemm7qEgRdpvTg", "reason": { "type": "query_shard_exception", "reason": "failed to create query: {\n \"match\" : {\n \"age\" : {\n \"query\" : 18,\n \"operator\" : \"OR\",\n \"prefix_length\" : 0,\n \"max_expansions\" : 50,\n \"fuzzy_transpositions\" : true,\n \"lenient\" : false,\n \"zero_terms_query\" : \"NONE\",\n \"auto_generate_synonyms_phrase_query\" : true,\n \"boost\" : 1.0\n }\n }\n}", "index_uuid": "GHBPeT5pRnSi3g6DkpIkow", "index": "m4", "caused_by": { "type": "illegal_argument_exception", "reason": "Cannot search on field [age] since it is not indexed." } } } ] }, "status": 400 }
返回的是报错结果,这其中就是index
参数在起作用。
小结:index
属性默认为true
,如果该属性设置为false
,那么,elasticsearch
不会为该属性创建索引,也就是说无法当做主查询条件。
copy_to
再来学习一个copy_to
属性,该属性允许我们将多个字段的值复制到组字段中,然后将组字段作为单个字段进行查询。
PUT m5 { "mappings": { "doc": { "dynamic":false, "properties": { "first_name":{ "type": "text", "copy_to": "full_name" }, "last_name": { "type": "text", "copy_to": "full_name" }, "full_name": { "type": "text" } } } } } PUT m5/doc/1 { "first_name":"tom", "last_name":"ben" } PUT m5/doc/2 { "first_name":"john", "last_name":"smith" } GET m5/doc/_search { "query": { "match": { "first_name": "tom" } } } GET m5/doc/_search { "query": { "match": { "full_name": "tom" } } }
我们将first_name
和last_name
都复制到full_name
中。并且使用full_name
查询也返回了结果
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.2876821, "hits" : [ { "_index" : "m5", "_type" : "doc", "_id" : "1", "_score" : 0.2876821, "_source" : { "first_name" : "tom", "last_name" : "ben" } } ] } }
返回结果表示查询成功。那么想要查询tom
或者smith
该怎么办?
GET m5/doc/_search { "query": { "match": { "full_name": { "query": "tom smith", "operator": "or" } } } }