ElasticSearch入门-结构定义之Mapping

2019-03-11 09:24|来源: 网络

相当于数据库的表结构的定义,elasticsearch的mapping 也很重要。直接关系到性能及搜索结果的准确性。elasticsearch的java api的例子太少,我在这儿就献丑了。

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

Java代码
  1. public class TestModel implements Serializable {  

  2.    private static final long serialVersionUID = 3174577828007649745L;  

  3.    //主ID  

  4.    private long id;  

  5.    //类型,为types之一  

  6.    private String type;  

  7.    /**

  8.     * 这里是一个列表

  9.     */  

  10.    private List<Integer> catIds;  

  11.      

  12.      

  13.    public long getId() {  

  14.        return id;  

  15.    }  

  16.    public void setId(long id) {  

  17.        this.id = id;  

  18.    }  

  19.    public String getType() {  

  20.        return type;  

  21.    }  

  22.    public void setType(String type) {  

  23.        this.type = type;  

  24.    }  

  25.    public List<Integer> getCatIds() {  

  26.        return catIds;  

  27.    }  

  28.    public void setCatIds(List<Integer> catIds) {  

  29.        this.catIds = catIds;  

  30.    }  

  31. }  

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

Java代码
  1. /**

  2.     * mapping 一旦定义,之后就不能修改。

  3.     * @return

  4.     * @throws Exception

  5.     */  

  6.    private static XContentBuilder getMapping() throws Exception{  

  7.        XContentBuilder mapping = jsonBuilder()    

  8.                   .startObject()    

  9.                     .startObject("test")    

  10.                     .startObject("properties")          

  11.                       .startObject("id")  

  12.                            .field("type", "long")  

  13.                            .field("store", "yes")  

  14.                        .endObject()      

  15.                          

  16.                       .startObject("type")  

  17.                            .field("type", "string")  

  18.                            .field("index", "not_analyzed")  

  19.                        .endObject()    

  20.                          

  21.                       .startObject("catIds")  

  22.                            .field("type", "integer")  

  23.                       .endObject()    

  24.                     .endObject()    

  25.                    .endObject()    

  26.                  .endObject();    

  27.        return mapping;  

  28.    }  


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

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

Java代码
  1. Client client = ESUtils.getClient();  

  2.        //首先创建索引库  

  3.        CreateIndexResponse  indexresponse = client.admin().indices()  

  4.        //这个索引库的名称还必须不包含大写字母  

  5.        .prepareCreate("testindex").execute().actionGet();  

  6.        System.out.println(indexresponse.acknowledged());;  

  7.        //如果是在两台机器上,下面直接putMapping可能会报异常  

  8.        PutMappingRequestBuilder builder = client.admin().indices().preparePutMapping("testindex");  

  9.        //testType就像当于数据的table  

  10.        builder.setType("testType");  

  11.        XContentBuilder mapping = getMapping();  

  12.        builder.setSource(mapping);  

  13.        PutMappingResponse  response = builder.execute().actionGet();  

  14.        System.out.println(response.isAcknowledged());  


其中,这个代码在我本机出现一点问题,当我创建完index后,直接创建mapping 的时候,报index missing。我把两个es Node停掉一个就没有问题了。可见,ES将create index和putMapping放到了两个不同的es Node下面,导致了上面那个异常。

好了,有时为了测试,可能需要删除某个索引,代码如下:

Java代码
  1. Client client = ESUtils.getClient();  

  2.        client.admin().indices()  

  3.        //这个索引库的名称还必须不包含大写字母  

  4.        .prepareDelete("testindex").execute().actionGet();  

对这类话题感兴趣?欢迎发送邮件至 donlianli@126.com    
关于我:邯郸人,擅长Java,Javascript,Extjs,oracle sql。    
更多我之前的文章,可以访问  我的空间    

 
转自:http://donlianli.iteye.com/blog/1921149

相关问答

更多
  • Mapping,就是对索引库中索引的字段名及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,不过es的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。有两种添加mapping的方法,一种是定义在配置文件中,一种是运行时手动提交mapping,两种选一种就行了。 先介绍在配置文件中定义map ...
  • Mapping,就是对索引库中索引的字段名及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,不过es的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。有两种添加mapping的方法,一种是定义在配置文件中,一种是运行时手动提交mapping,两种选一种就行了。 先介绍在配置文件中定义map ...
  • 您正在寻找索引的索引模板 。 我认为您可以使用正则表达式匹配您的索引名称,并自动按模板创建索引映射,如: PUT _template/template_1 { "template": "\d\d\d\d-\d\d-\d\d", //index name match You are looking for Index Templates for indexes. I think you can use regex to match your index name, and automatically c ...
  • 对于某些在2.x或5.x中不是有效类型的字段,您使用的是int类型。 对于整数值,请根据您要存储的值使用integer或long integer 。 有关详细信息,请参阅核心映射类型的文档 。 您正在使用哪种版本的elasticsearch - 2.x或5.x? 如果你已经在5.x上了,你应该使用keyword或text作为你的字符串字段,而不是只使用string ,这个string的命名最多为2.x. 但这仍然只是一个警告。 另外,你应该知道使用nested而不是仅仅object时的含义。 如果您存储对象 ...
  • 我刚刚遇到了完全相同的问题,问题是Spring Data ES(截至2016年5月11日)不支持地理形状。 从DATAES-169中可以看出,这个问题尚未引起太多关注。 出于这个原因,我已经分配了官方的spring-data-elasticsearch存储库并决定自己实现它。 我已经让它适用于多边形和圆形,但我还没有推出我的代码。 我打算在推送和提交PR之前支持所有形状。 敬请关注... I've ran into the exact same issue a while ago and the probl ...
  • 如果生成了像12345-abc这样的键并且可能是无限值,那么执行一些有用的查询或聚合将变得很困难(如果不是不可能的话)。 您分析数据的具体用例并不是很清楚,但您应该看一下nested objects ( https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects。 html )并根据您要查询的内容生成输入json。 如果将这些附加对象放入一个包含当前关键字段的特殊字段的数组中,您似乎会有更好的聚合结果。 { "st ...
  • 您可以使用转换但请注意,此功能在2.x中已弃用,并将在ES 5中删除.ES 5的唯一选项是在您自己的客户端代码中进行转换,并相应地更改已经更改的值。 但是,就目前而言,使用变换: { "mappings": { "exam": { "transform": { "script": "if (ctx._source['score'].toInteger()>=0) ctx._source['custom_score'] = ctx._source['score'].to ...
  • 我使用Put来创建River而不是Post,这导致出现奇怪错误的问题,即没有索引的文档。 我把它改成POST一切都很好。 I used Put to create the River instead of Post, which led to the problem that the strange error appeared that no documents where indexed. I changed it to POST everything was fine.
  • 你错过了类型声明: curl -H "Content-Type: application/json" -XPUT http://localhost:9200/technogym_error_timeline -d '{ "mappings":{ "your_type_name": { <--- add this "properties": { <--- and this "timestamp ...
  • 要首先创建索引,您需要调用PUT test而不是POST /test/text 。 后者只是在一个名为test的新索引中创建一个类型为text的新文档,但是使用默认设置和映射。 首先: PUT /test { "settings": { ... }, "mappings": { ... } } 然后您可以创建新文档(请注意您的映射类型称为article ,而不是text ) POST /test/article { "title": " ", "content": ...