您的位置:首页 > 移动开发

Elasticsearch教程,Elasticsearch Java API创建Mapping,指定分词器

2017-05-29 10:40 417 查看
先说
Elasticsearch 版本,我的
Elasticsearch 版本是
2.x
,具体是
2.0.2

,所以参照的时候,请先核对版本,在版本相差大的情况下,先可以试试。

为什么要指定分词器,因为我们在搜索(
Search
)的时候,创建索引(
Index
)的时候,都有规则,如果我们这个规则不同,那么我们就可以指定了。

原文:Elasticsearch教程,Elasticsearch Java API创建Mapping,指定分词器

场景:

当我一个索引库是存储生鲜蔬菜的,那词库应该就是定制的生鲜蔬菜相关的。而另外一个是服装的,那么这2个索引库分词,搜索规则肯定大不相同。

之前发布过:Elasticsearch教程(五) elasticsearch Mapping的创建 ,可以看看。

然后一系列的入门教程:

Elasticsearch 目录

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


当你只设置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 近义词搜索 的设置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  elasticsearch mapping