es 创建索引 指定id_Elasticsearch搜索API使用一:创建索引并指定索引类型的mapping...

本文介绍了如何在Elasticsearch中创建索引时定义mapping,特别是针对需要整词匹配的情况。通过创建名为index_name的索引,并定义索引类型index_type的mapping,确保NAME字段有一个不被分析的版本NAME.raw,以便进行term aggregation获取城市出现的次数。建议使用Elasticsearch Head插件进行测试,安装简单且操作便利。
摘要由CSDN通过智能技术生成

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

这时,就需要我们在创建索引时定义mapping。假设索引叫index_name,索引类型的名字叫index_type,编写mapping文件如下(注意:mapping文件中,index_type必须与实际索引当中的索引类型完全一致。):

{

"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方式的请求编写如下:

{

"query": {

"match_all": {}

},

"aggregations": {

"cityAggs": {

"terms": {

"field": "NAME.raw"

}

}

}

}

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

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值