`

elasticsearch的Mapping定义

 
阅读更多
Mapping,就是对索引库中索引的字段名及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,不过es的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。有两种添加mapping的方法,一种是定义在配置文件中,一种是运行时手动提交mapping,两种选一种就行了。

注意:
1、相当于数据库的表结构的定义,elasticsearch的mapping 也很重要。直接关系到性能及搜索结果的准确性。
2、elasticsearch的field一旦定义后就无法修改,增删改字段的话。从头定义表和建索引

先介绍在配置文件中定义mapping,你可以把[mapping名].json文件放到config/mappings/[索引名]目录下,这个目录要自己创建,一个mapping和一个索引对应,你也可以定义一个默认的mapping,把自己定义的default-mapping.json放到config目录下就行。json格式如下:
{
   "mappings":{
      "properties":{
         "title":{
            "type":"string",
            "store":"yes"
         },
         "description":{
            "type":"string",
            "index":"not_analyzed"
         },
         "price":{
            "type":"double"
         },
         "onSale":{
            "type":"boolean"
         },
         "type":{
            "type":"integer"
         },
         "createDate":{
            "type":"date"
         }
      }
   }
}


接下来介绍通过请求添加mapping,下面为一个添加productIndex索引库的mapping的json格式请求。其中productIndex为索引类型,properties下面的为索引里面的字段,type为数据类型,store为是否存储,”index”:”not_analyzed”为不对该字段进行分词。
{
   "productIndex":{
      "properties":{
         "title":{
            "type":"string",
            "store":"yes"
         },
         "description":{
            "type":"string",
            "index":"not_analyzed"
         },
         "price":{
            "type":"double"
         },
         "onSale":{
            "type":"boolean"
         },
         "type":{
            "type":"integer"
         },
         "createDate":{
            "type":"date"
         }
      }
   }
}

用java api调用的代码如下:
先创建空索引库
client.admin().indices().prepareCreate("productIndex").execute().actionGet();


put mapping
XContentBuilder mapping = jsonBuilder()
       .startObject()
         .startObject("productIndex")
         .startObject("properties")       
           .startObject("title").field("type", "string").field("store", "yes").endObject()  
           .startObject("description").field("type", "string").field("index", "not_analyzed").endObject()
           .startObject("price").field("type", "double").endObject()
           .startObject("onSale").field("type", "boolean").endObject()
           .startObject("type").field("type", "integer").endObject()
           .startObject("createDate").field("type", "date").endObject()               
         .endObject()
        .endObject()
      .endObject();
 PutMappingRequest mappingRequest = Requests.putMappingRequest("productIndex").type("productIndex").source(mapping);
 client.admin().indices().putMapping(mappingRequest).actionGet();


讲完mapping的定义后,给个例子:

为了说明mapping的定义,我这里定义了一个简单的模型,就ID,type,和catIds 3个属性,重在说明如何使用java api来定义mapping,具体各field应该如何定义,这里不做讨论。

public class TestModel implements Serializable {
	private static final long serialVersionUID = 3174577828007649745L;
	//主ID
	private long id;
	//类型,为types之一
	private String type;
	/**
	 * 这里是一个列表
	 */
	private List<Integer> catIds;
	
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public List<Integer> getCatIds() {
		return catIds;
	}
	public void setCatIds(List<Integer> catIds) {
		this.catIds = catIds;
	}
}

我们假设id就存储为long类型,type存储为字符串类型,catIds为一个列表,其实际类型为integer类型。定义的mapping如下:

/**
	 * mapping 一旦定义,之后就不能修改。
	 * @return
	 * @throws Exception
	 */
	private static XContentBuilder getMapping() throws Exception{
		XContentBuilder mapping = jsonBuilder()  
			       .startObject()  
			         .startObject("test")  
			         .startObject("properties")         
			           .startObject("id")
			           		.field("type", "long")
			           		.field("store", "yes")
			           	.endObject()    
			           	
			           .startObject("type")
			           		.field("type", "string")
			           		.field("index", "not_analyzed")
			           	.endObject()  
			           	
			           .startObject("catIds")
			           		.field("type", "integer")
			           .endObject()  
			         .endObject()  
			        .endObject()  
			      .endObject();  
		return mapping;
	}

注意:elasticsearch的field一旦定义后就无法修改,你想增加一个store属性,都不行。

下面就是调用JAVA API了,注意,在定义mapping之前,还需要先创建一个index库。这里,我index库和mapping 写到一个方法里面了。

               Client client = ESUtils.getClient();
//首先创建索引库
CreateIndexResponse  indexresponse = client.admin().indices()
//这个索引库的名称还必须不包含大写字母
.prepareCreate("testindex").execute().actionGet();
System.out.println(indexresponse.acknowledged());

//如果是在两台机器上,下面直接putMapping可能会报异常
PutMappingRequestBuilder builder = client.admin().indices().preparePutMapping("testindex");
//testType就像当于数据的table
builder.setType("testType");
XContentBuilder mapping = getMapping();
builder.setSource(mapping);
PutMappingResponse  response = builder.execute().actionGet();
System.out.println(response.acknowledged());
其中,这个代码在我本机出现一点问题,当我创建完index后,直接创建mapping 的时候,报index missing。我把两个es Node停掉一个就没有问题了。可见,ES将create index和putMapping放到了两个不同的es Node下面,导致了上面那个异常。

好了,有时为了测试,可能需要删除某个索引,代码如下:
Client client = ESUtils.getClient();
client.admin().indices()
//这个索引库的名称还必须不包含大写字母
.prepareDelete("testindex").execute().actionGet();
分享到:
评论

相关推荐

    一款基于Java注解的elasticsearch mapping生成工具,支持ES 5.2.0所有可选参数.zip

    这个基于Java注解的Elasticsearch mapping生成工具,旨在简化ES 5.2.0环境下的映射管理工作,通过注解方式提供强大的映射定义能力。它不仅提高了开发效率,还增强了代码的可读性和维护性。在实际项目中,这样的工具...

    es-mapping-generator:基于自定义注释解根据Java实体模型生成elasticsearch的映射配置

    ElasticSearch映射生成器该工具允许在创建索引时为索引生成映射或设置。...使用注释描述定义的映射字段安装二进制文件部署在Maven Central上,您可以将工件导入到您的项目中: &lt; dependency&gt; &lt; groupId&gt;...

    基于.netcore搜索封装ElasticSearch.zip

    2. **创建索引**: 定义数据模型并创建对应的Elasticsearch索引。索引是Elasticsearch中的逻辑存储单元,类似于关系数据库中的表。 3. **序列化与反序列化**: 使用Nest库,对象会被自动转换为JSON格式,发送到...

    elasticsearch-8.11.3-linux-x86-64.tar.gz.zip

    7. **映射(Mapping)**:映射是Elasticsearch中的字段配置,定义了字段的数据类型、分析器等,影响着数据的索引和搜索行为。 8. **搜索性能**:Elasticsearch利用倒排索引技术,提供快速的全文检索。同时,通过...

    elasticSearch的操作demo

    最后,`es`包可能是Elasticsearch相关的操作接口或抽象类,它们定义了与Elasticsearch交互的方法,如添加、更新、删除文档,以及查询等。例如: ```java public interface ElasticsearchRepository { void save...

    elasticsearch-7.4.0-win64.rar

    - **类型(Type)**:在6.x版本后被文档映射(Mapping)取代,用于定义索引中每个字段的数据类型。 - **文档(Document)**:索引中的最小数据单元,以JSON格式存在。 - **分片(Shard)**:索引的逻辑部分,用于水平...

    Elasticsearch java工具类

    在Elasticsearch中,mapping是定义索引中字段的数据类型和属性的过程,它影响着数据如何被索引和搜索。通过自定义注解,开发者可以在实体类上直接声明字段的mapping,避免了手动编写JSON映射文件的繁琐工作。这使得...

    elasticsearch-7.14.0+分词器+head插件一键下载

    2. 数据索引:创建合适的索引模板,定义映射(Mapping)以指定字段类型和分析器。 3. 分词器优化:选择适合的分词器,并可能需要自定义分词规则以满足特定需求。 4. 性能调优:监控集群性能,调整索引刷新频率、副本...

    Elasticsearch2.4.4免安装下载

    4. **动态映射**: 当新类型的数据被索引时,Elasticsearch 可以自动创建映射(mapping),定义字段的数据类型,也可以手动配置。 5. **实时分析**: 数据一旦被索引,即可立即用于搜索和分析,无需等待批处理过程。 ...

    Elasticsearch5.6版本的Jar包

    6. **映射(Mapping)**:映射是Elasticsearch中定义字段数据类型的配置,它决定了数据如何被索引和搜索。5.6版本支持自动映射,但也可以自定义映射以满足特定需求。 7. **近实时处理(NRT)**:Elasticsearch具有...

    ElasticSearch入门到精通(基于ELK技术栈ElasticSearch7.8.版本).rar

    - **映射(Mapping)**:定义字段的数据类型,有助于优化查询性能。 **2. Elasticsearch 的安装与配置** 安装 Elasticsearch 可通过下载官方二进制包,解压后配置 `elasticsearch.yml` 文件,包括设置路径、网络...

    Elasticsearch 8.1.2 Linux版本

    每个索引都有一个唯一的名称,并且可以设置相关的映射(Mapping)来定义字段的数据类型。 3. **文档(Document)**:索引中的基本单位,通常表示一种实体的信息,以JSON格式存储。 4. **类型(Type)**:在Elastic...

    最新版windows elasticsearch-8.1.1-windows-x86_64.zip

    - **映射(Mapping)**:定义字段的数据类型和分析规则。 - **分片(Shard)**:索引被分成多个分片,可以分布在不同节点上,提高可伸缩性和性能。 - **副本(Replica)**:分片的备份,用于提高可用性和故障恢复。 2....

    ElasticSearch安装ik分词插件.txt

    cp elasticsearch-analysis-ik-1.2.5.jar ES_HOME/plugins/analysis-ik/ ``` 同时,在 ElasticSearch 的配置文件 `elasticsearch.yml` 中添加以下内容来启用 ik 分词器: ```yaml index: analysis: analyzer: ik...

    Elasticsearch7.0实例精解 源代码.zip

    Elasticsearch 7.0 实例精解源代码是一份深度解析Elasticsearch 7.0版本核心功能和实际应用的资源集合。这份压缩包包含了详细的示例代码,旨在帮助开发者更好地理解和掌握Elasticsearch的强大功能。以下是基于...

    Elasticsearch参考手册中文版高清

    **Elasticsearch** 是一个流行的开源全文搜索引擎,广泛应用于大数据分析、日志分析、实时搜索等领域。本参考资料基于《Elasticsearch 权威指南》的中文版,由原作者Clinton Gormley和Zachary Tong编著,旨在帮助...

    最完整的Elasticsearch 基础教程

    - 创建索引:`PUT /index_name`,定义映射(mapping)来规范字段类型。 - 插入文档:`POST /index_name/_doc`,JSON格式表示数据。 - 查询索引:`GET /index_name/_search`,使用JSON构造查询条件。 5. **搜索...

    Elasticsearch权威指南(中文).pdf

    **Elasticsearch权威指南概述** Elasticsearch是一个开源的全文搜索引擎,基于Lucene构建,设计用于分布式、实时的搜索和分析引擎。它不仅提供搜索功能,还支持数据分析、日志收集等多种用途。这本书《Elastic...

    Elasticsearch 7基于springboot的应用

    **Elasticsearch 7 ...提供的 `elasticsearch.pdf` 文件可能包含了更深入的理论介绍和最佳实践,而 `maguo-es-jd` 和 `maguo-es-api` 文件可能包含具体的代码示例和 API 使用说明,对于初学者来说是很好的学习资源。

Global site tag (gtag.js) - Google Analytics