Elasticsearch搜索API使用一:建立索引并指定索引类型的mapping

ES默认是动态建立索引和索引类型的mapping的。这就至关于无需定义Solr中的Schema,无需指定各个字段的索引规则就能够索引文件,很方便。但有时方便就表明着不灵活。好比,ES默认一个字段是要作分词的,但咱们有时要搜索匹配整个字段却不行。若有统计工做要记录每一个城市出现的次数。对于NAME字段,若记录“new york”文本,ES可能会把它拆分红“new”和“york”这两个词,分别计算这个两个单词的次数,而不是咱们指望的“new york”。java

这时,就须要咱们在建立索引时定义mapping。假设索引叫index_name,索引类型的名字叫index_type,编写mapping文件以下(注意:mapping文件中,index_type必须与实际索引当中的索引类型彻底一致。):
json

{	
	   "index_type":{  
		  "properties":{  
			 "ID":{  
				"type":"string",  
				"index":"not_analyzed"   
			 },  			 
			 "NAME":{
				"type":"string",
				"fields":{
					"NAME":{
						"type":"string"
					},
					"raw":{
						"type":"string",
						"index":"not_analyzed"	
					}
				}					
			 } 		 	 		
		  }  
	   }   
}

以上文件是说咱们对于index_type这个索引类型,定义了它的mapping。重点是将NAME这个字段映射为两个,一个是须要作索引分析的NAME,另外一个是不分析的raw,即不会拆分new york这种词组。这样咱们在作搜索的时候,就能够对NAME.raw这个字段作term aggregation,得到全部城市出现的次数了。term aggregation的REST方式的请求编写以下:app

{
  "query": {
    "match_all": {}
  },
  "aggregations": {
    "cityAggs": {
      "terms": {
        "field": "NAME.raw"
      }
    }
  }
}

因为我使用的是Windows开发机,强烈推荐安装Elasticsearch Head来作测试,比命令行Curl方便多了。Elasticsearch Head的安装很简单,进入ES的bin目录,执行elasticsearch

plugin -install mobz/elasticsearch-head


具体实现时,编写JAVA代码建立索引index_name,建立索引类型index_type指定这个mapping的方法以下测试

//省略读取mapping文件的java代码,内容保存在mapping_json中。
Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
client.admin().indices().prepareCreate("index_name").execute().actionGet();
client.admin().indices().preparePutMapping("index_name").setType("index_type").setSource(mapping_json).execute().actionGet();
相关文章
相关标签/搜索