Elasticsearch索引

一、基础概念:

1、索引:

索引(index)是elasticsearch的一个逻辑存储,可以理解为关系型数据库中的数据库,es可以把索引数据存放到一台服务器上,也可以sharding后存到多台服务器上,每个索引有一个或多个分片,每个分片可以有多个副本。

2、索引类型(index_type):

在es中,一个索引对象可以存储多个不同用途的对象,通过索引类型(index_type)可以区分单个索引中的不同对象,可以理解为关系型数据库中的表。每个索引类型可以有不同的结构,但是不同的索引类型不能为相同的属性设置不同的类型。

3、文档(document):

存储在es中的主要实体叫文档(document),可以理解为关系型数据库中表的一行记录。每个文档由多个字段构成,es是一个非结构化的数据库,每个文档可以有不同的字段,并且有一个唯一的标识符。

4、映射(mapping):

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

这时,就需要我们在创建索引时定义mapping。此外,es支持多字段结构,例如:我们希望两个字段中有相同的值,一个用于搜索,一个用户排序;或者一个用于分词器分析,一个用于空白字符。例如:编写mapping文件如下:

[html] view plain copy
  1. {     
  2.        "index_type":{    
  3.           "properties":{    
  4.              "ID":{    
  5.                 "type":"string",    
  6.                 "index":"not_analyzed"     
  7.              },                
  8.              "NAME":{  
  9.                 "type":"string",  
  10.                 "fields":{  
  11.                     "NAME":{  
  12.                         "type":"string"  
  13.                     },  
  14.                     "raw":{  
  15.                         "type":"string",  
  16.                         "index":"not_analyzed"    
  17.                     }  
  18.                 }                     
  19.              }                    
  20.           }    
  21.        }     
  22. }  
以上文件是说我们对于index_type这个索引类型,定义了它的mapping。重点是将NAME这个字段映射为两个,一个是需要做索引分析的NAME,另一个是不分析的raw,即不会拆分new york这种词组。这样我们在做搜索的时候,就可以对NAME.raw这个字段做term aggregation,获得所有城市出现的次数了。term aggregation的REST方式的请求编写如下:
[html] view plain copy
  1. {  
  2.   "query": {  
  3.     "match_all": {}  
  4.   },  
  5.   "aggregations": {  
  6.     "cityAggs": {  
  7.       "terms": {  
  8.         "field": "NAME.raw"  
  9.       }  
  10.     }  
  11.   }  
  12. }  

二、创建索引:

1、使用postman工具:

1)es提供了restful api,可以通过post请求,创建索引的mapping。如下图:url为es服务器集群中的一个节点ip,端口是9200,其中test是索引名称;post数据中,test_type是索引类型名称,里面包含了两个字段id和name

Elasticsearch索引

2)删除索引:

同样,es提供了restful api,可以通过delete请求,删除索引。

Elasticsearch索引

2、使用es-java api:

上面我们使用了http常用的方式创建所以,接下来我们使用api的方式:

[html] view plain copy
  1. public static boolean createIndex(String indexName, String indexType,  
  2.             String mappingSource) {  
  3.   
  4.     if (isExistsIndex(indexName)) {  
  5.         return false;  
  6.     }  
  7.     IndicesAdminClient indicesAdminClient = transportClient.admin()  
  8.             .indices();  
  9.               
  10.     // setting  
  11.     Settings settings = Settings.builder().put("index.number_of_shards", 3)  
  12.             .put("index.number_of_replicas", 2).build();  
  13.               
  14.     // mapping  
  15.     CreateIndexResponse response = indicesAdminClient  
  16.             .prepareCreate(indexName).setSettings(settings)// setting  
  17.             .addMapping(indexType, mappingSource)// type,mapping  
  18.             .get();  
  19.     return response.isAcknowledged();  
  20. }  
  21.   
  22. public static void testCreateIndex4Mapping() {  
  23.     String indexName=  "test";  
  24.     String indexType = "test_type";  
  25.   
  26.     JSONObject mappingJson = new JSONObject();  
  27.     JSONObject mappingTypeJson = new JSONObject();  
  28.     JSONObject propertiesJson = new JSONObject();  
  29.   
  30.     JSONObject  idJson = new JSONObject();  
  31.     idJson.put("type", "string");  
  32.     idJson.put("store", "true");  
  33.     propertiesJson.put("id", idJson);  
  34.   
  35.     JSONObject nameJson = new JSONObject();  
  36.     nameJson.put("type", "string");  
  37.     propertiesJson.put("name", nameJson);  
  38.       
  39.     mappingTypeJson.put("properties", propertiesJson);  
  40.     mappingJson.put(indexType, mappingTypeJson);  
  41.       
  42.     logger.info(mappingJson.toJSONString());  
  43.   
  44.     createIndex(indexName, indexType, mappingJson.toJSONString());  
  45. }  

其中,mappingSource打印出来的字符:

[html] view plain copy
  1. {  
  2.     "test_type": {  
  3.         "properties": {  
  4.             "id": {  
  5.                 "store": "true",  
  6.                 "type": "string"  
  7.             },  
  8.             "name": {  
  9.                 "type": "string"  
  10.             }  
  11.         }  
  12.     }  
  13. }