Elasticsearch教程,Elasticsearch Java API创建Mapping,指定分词器
先说 Elasticsearch 版本,我的 Elasticsearch 版本是2.x
,具体是2.0.2
,所以参照的时候,请先核对版本,在版本相差大的情况下,先可以试试。
为什么要指定分词器,因为我们在搜索(Search
)的时候,创建索引(Index
)的时候,都有规则,如果我们这个规则不同,那么我们就可以指定了。
场景:
当我一个索引库是存储生鲜蔬菜的,那词库应该就是定制的生鲜蔬菜相关的。而另外一个是服装的,那么这2个索引库分词,搜索规则肯定大不相同。
之前发布过:Elasticsearch教程(五) elasticsearch Mapping的创建 ,可以看看。
然后一系列的入门教程:
- Elasticsearch教程(一),全程直播(小白级别)
- Elasticsearch教程(二),IK分词器安装
- Elasticsearch教程(三),IK分词器安装 (极速版)
- Elasticsearch安装(四), elasticsearch head 插件安装和使用。
- Elasticsearch教程(五) elasticsearch Mapping的创建
- Elasticsearch教程(六) elasticsearch Client创建
- Elasticsearch教程(七) elasticsearch Insert 插入数据(Java)
- Elasticsearch教程(八) elasticsearch delete 删除数据(Java)
- Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
好了废话不多说,下面开始走代码,本章节主要说Java API。
Java API 创建Mapping
public class SearchIndexMapping implements BaseMapping{
public static XContentBuilder getMapping(){
XContentBuilder mapping = null;
try {
mapping = jsonBuilder()
.startObject()
//关闭TTL
.startObject("_ttl")
.field("enabled",false)
.endObject()
.startObject("properties")
.startObject("id").field("type","long").endObject()
.startObject("title")
.field("type","string")
.field("store", "yes")
//指定index analyzer 为 ik
.field("analyzer", "ik")
//指定search_analyzer 为ik_syno
.field("searchAnalyzer", "ik_syno")
.endObject()
.startObject("description").field("type","string").field("index","not_analyzed").endObject()
.startObject("url").field("type","string").field("index","not_analyzed").endObject()
.startObject("type").field("type","integer").endObject()
.endObject()
.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return mapping;
}
//创建Mapping
public static void createMapping(){
//先创建索引
CreateIndexRequest request = new CreateIndexRequest(DB_INDEX);
ESTools.client.admin().indices().create(request);
//创建mapping
PutMappingRequest mapping = Requests.putMappingRequest(DB_INDEX).type(SEARCH_INDEX).source(getMapping());
ESTools.client.admin().indices().putMapping(mapping).actionGet();
}
}
主要说明部分
.startObject("title")
.field("type","string")
.field("store", "yes")
//指定index analyzer 为 ik_syno
.field("analyzer", "ik")
//指定search_analyzer 为ik_syno
.field("searchAnalyzer", "ik_syno")
.endObject()
我遇到的坑是,老把 analyzer 写成 index_ analyzer,会提示一下异常:
Request processing failed; nested exception is MapperParsingException[Mapping definition for [title] has unsupported parameters: [index_analyzer : ik_syno]]
当你只设置search_analyzer的时候,要你先设置analyzer。
Request processing failed; nested exception is MapperParsingException[analyzer on field [title] must be set when search_analyzer is set]
当你的分词器不存在的时候,会如下错误:
Request processing failed; nested exception is MapperParsingException[analyzer [分词器名称] not found for field [被设置的字段]]
OK了,指定分词器说完毕了,下面一篇会说 Elasticsearch 近义词搜索 的设置。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/232.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。