ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等
如果此文章对你有帮助,请关注一下哦
1.1 搭建maven 工程 创建web工程
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.elastic</groupId> 5 <artifactId>search-service</artifactId> 6 <packaging>war</packaging> 7 <version>1.0-SNAPSHOT</version> 8 <name>search-service Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 <properties> 11 <junit.version>4.5</junit.version> 12 <spring.version>4.2.4.RELEASE</spring.version> 13 <mybatis.version>3.2.8</mybatis.version> 14 <mybatis.spring.version>1.2.2</mybatis.spring.version> 15 <mybatis.paginator.version>1.2.15</mybatis.paginator.version> 16 <mysql.version>5.1.32</mysql.version> 17 <slf4j.version>1.6.4</slf4j.version> 18 <jackson.version>2.4.2</jackson.version> 19 <druid.version>1.0.9</druid.version> 20 <jstl.version>1.2</jstl.version> 21 <servlet-api.version>2.5</servlet-api.version> 22 <jsp-api.version>2.0</jsp-api.version> 23 <joda-time.version>2.5</joda-time.version> 24 <commons-lang3.version>3.3.2</commons-lang3.version> 25 <commons-io.version>1.3.2</commons-io.version> 26 <commons-net.version>3.3</commons-net.version> 27 <jsqlparser.version>0.9.1</jsqlparser.version> 28 <commons-fileupload.version>1.3.1</commons-fileupload.version> 29 <jedis.version>2.7.2</jedis.version> 30 <activemq.version>5.11.2</activemq.version> 31 <quartz.version>2.2.2</quartz.version> 32 <slf4j.version>1.7.21</slf4j.version> 33 <log4j.version>1.2.12</log4j.version> 34 <solr.version>6.1.0</solr.version> 35 <fastjson.version>1.2.13</fastjson.version> 36 <diamond.version>0.0.1-SNAPSHOT</diamond.version> 37 <cors.filter>2.5</cors.filter> 38 <java.property.utils>1.10</java.property.utils> 39 <jackson.version>2.4.2</jackson.version> 40 </properties> 41 <dependencies> 42 <dependency> 43 <groupId>junit</groupId> 44 <artifactId>junit</artifactId> 45 <version>3.8.1</version> 46 <scope>test</scope> 47 </dependency> 48 <dependency> 49 <groupId>org.elasticsearch.client</groupId> 50 <artifactId>transport</artifactId> 51 <version>6.0.0</version> 52 </dependency> 53 <dependency> 54 <groupId>org.slf4j</groupId> 55 <artifactId>jcl-over-slf4j</artifactId> 56 <version>1.7.21</version> 57 <scope>runtime</scope> 58 </dependency> 59 <dependency> 60 <groupId>org.slf4j</groupId> 61 <artifactId>slf4j-api</artifactId> 62 <version>1.7.21</version> 63 </dependency> 64 <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> 65 <dependency> 66 <groupId>org.slf4j</groupId> 67 <artifactId>slf4j-log4j12</artifactId> 68 <scope>runtime</scope> 69 </dependency> 70 <!-- https://mvnrepository.com/artifact/log4j/log4j --> 71 <dependency> 72 <groupId>log4j</groupId> 73 <artifactId>log4j</artifactId> 74 <version>1.2.17</version> 75 </dependency> 76 <dependency> 77 <groupId>commons-logging</groupId> 78 <artifactId>commons-logging</artifactId> 79 <version>1.2</version> 80 </dependency> 81 <dependency> 82 <groupId>junit</groupId> 83 <artifactId>junit</artifactId> 84 <scope>test</scope> 85 </dependency> 86 <dependency> 87 <groupId>javax.servlet</groupId> 88 <artifactId>servlet-api</artifactId> 89 <version>2.5</version> 90 <scope>provided</scope> 91 </dependency> 92 <dependency> 93 <groupId>com.alibaba</groupId> 94 <artifactId>fastjson</artifactId> 95 </dependency> 96 <!-- spring dependencies --> 97 <dependency> 98 <groupId>org.springframework</groupId> 99 <artifactId>spring-core</artifactId> 100 <version>${spring.version}</version> 101 <!--<exclusions>--> 102 <!--<exclusion>--> 103 <!--<groupId>commons-logging</groupId>--> 104 <!--<artifactId>commons-logging</artifactId>--> 105 <!--</exclusion>--> 106 <!--</exclusions>--> 107 </dependency> 108 <dependency> 109 <groupId>org.springframework</groupId> 110 <artifactId>spring-test</artifactId> 111 <version>${spring.version}</version> 112 </dependency> 113 <dependency> 114 <groupId>org.springframework</groupId> 115 <artifactId>spring-context</artifactId> 116 <version>${spring.version}</version> 117 </dependency> 118 <dependency> 119 <groupId>org.springframework</groupId> 120 <artifactId>spring-context-support</artifactId> 121 <version>${spring.version}</version> 122 </dependency> 123 <dependency> 124 <groupId>org.springframework</groupId> 125 <artifactId>spring-aop</artifactId> 126 <version>${spring.version}</version> 127 </dependency> 128 <dependency> 129 <groupId>org.springframework</groupId> 130 <artifactId>spring-aspects</artifactId> 131 <version>${spring.version}</version> 132 </dependency> 133 <dependency> 134 <groupId>org.springframework</groupId> 135 <artifactId>spring-tx</artifactId> 136 <version>${spring.version}</version> 137 </dependency> 138 <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> 139 <dependency> 140 <groupId>org.springframework</groupId> 141 <artifactId>spring-jdbc</artifactId> 142 <version>${spring.version}</version> 143 </dependency> 144 145 <dependency> 146 <groupId>org.springframework</groupId> 147 <artifactId>spring-webmvc</artifactId> 148 <version>${spring.version}</version> 149 </dependency> 150 <!-- mysql dependencies --> 151 <dependency> 152 <groupId>mysql</groupId> 153 <artifactId>mysql-connector-java</artifactId> 154 <version>5.1.32</version> 155 </dependency> 156 <!-- https://mvnrepository.com/artifact/com.thetransactioncompany/cors-filter --> 157 <dependency> 158 <groupId>com.thetransactioncompany</groupId> 159 <artifactId>cors-filter</artifactId> 160 <version>${cors.filter}</version> 161 </dependency> 162 <!-- https://mvnrepository.com/artifact/com.thetransactioncompany/java-property-utils --> 163 <dependency> 164 <groupId>com.thetransactioncompany</groupId> 165 <artifactId>java-property-utils</artifactId> 166 <version>${java.property.utils}</version> 167 168 </dependency> 169 <dependency> 170 <groupId>com.alibaba</groupId> 171 <artifactId>fastjson</artifactId> 172 <version>${fastjson.version}</version> 173 </dependency> 174 </dependencies> 175 <build> 176 <finalName>search-service</finalName> 177 </build> 178 </project>
1.2 创建web项目
2.1 编写Java elasticsearch 客户端连接公共类 (这里使用elasticsearch单机版)
1 package com.elastic.common.conn;
2
3 import org.elasticsearch.client.transport.TransportClient;
4 import org.elasticsearch.common.settings.Settings;
5 import org.elasticsearch.common.transport.TransportAddress;
6 import org.elasticsearch.transport.client.PreBuiltTransportClient;
7 import org.springframework.stereotype.Component;
8
9 import java.net.InetAddress;
10
11 /**
12 * Created by xiaotian on 2017/12/1.
13 */
14 @Component
15 public class EsClient {
16
17 //private EsClient client = new EsClient();
18 TransportClient client = null;
19 public EsClient(){
20 try{
21 Settings settings = Settings.builder()
22 .put("client.transport.sniff", true)
23 .put("cluster.name", "elasticsearch").build();
24 client = new PreBuiltTransportClient(Settings.EMPTY)
25 .addTransportAddress(new TransportAddress(InetAddress.getByName("eshost"), 9300));
26
27 }catch (Exception ex){
28 client.close();
29 }finally {
30
31 }
32 }
33 public TransportClient getConnection(){
34
35 if (client==null){
36 synchronized (EsClient.class){
37 if (client==null){
38 new EsClient();
39 }
40 }
41 }
42 return client;
43
44 }
45
46 }
2.2 service层 接口设计
1. IndexService
1 package com.elastic.service.inter;
2
3 /**
4 * Created by xiaotian on 2017/12/1.
5 */
6 public interface IndexService {
7
8 public void index(String id);
9
10 public void get();
11 public void del(String id);
12 public void update(String id) throws Exception;
13 public void multiGet(String ... ids) throws Exception;
14 public void bulk(String ... ids) throws Exception;
15 public void bulkProcesstor(String index,String type,String... ids) throws Exception;
16
17 }
2. SearchService
1 package com.elastic.service.inter;
2
3 /**
4 * Created by xiaotian on 2017/12/2.
5 */
6 public interface SearchService {
7 public void search();
8 public void searchByCondition() throws Exception;
9 public void multiSearch();
10 public void aggsearch();
11 public void metricsAgg();
12
13 }
3. service层 接口实现
IndexServiceImpl
1 package com.elastic.service.impl;
2
3 import com.alibaba.fastjson.JSONObject;
4 import com.elastic.common.conn.EsClient;
5 import com.elastic.service.inter.IndexService;
6 import org.elasticsearch.action.ActionListener;
7 import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
8 import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
9 import org.elasticsearch.action.bulk.*;
10 import org.elasticsearch.action.get.GetResponse;
11 import org.elasticsearch.action.get.MultiGetItemResponse;
12 import org.elasticsearch.action.get.MultiGetResponse;
13 import org.elasticsearch.action.index.IndexRequest;
14 import org.elasticsearch.action.index.IndexRequestBuilder;
15 import org.elasticsearch.action.index.IndexResponse;
16 import org.elasticsearch.client.Requests;
17 import org.elasticsearch.common.document.DocumentField;
18 import org.elasticsearch.common.unit.ByteSizeUnit;
19 import org.elasticsearch.common.unit.ByteSizeValue;
20 import org.elasticsearch.common.unit.TimeValue;
21 import org.elasticsearch.common.xcontent.XContentBuilder;
22 import org.elasticsearch.common.xcontent.XContentType;
23 import org.elasticsearch.index.query.QueryBuilders;
24 import org.elasticsearch.index.reindex.BulkByScrollResponse;
25 import org.elasticsearch.index.reindex.DeleteByQueryAction;
26 import org.elasticsearch.rest.RestStatus;
27 import org.springframework.beans.factory.annotation.Autowired;
28 import org.springframework.stereotype.Service;
29
30 import java.io.IOException;
31 import java.util.*;
32
33 import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
34
35 /**
36 * Created by xiaotian on 2017/12/1.
37 */
38 @Service
39 public class IndexServiceImpl implements IndexService {
40
41 @Autowired
42 private EsClient client;
43
44 public void index(String id) {
45 // String json = "{" +
46 // ""user":"kimchy"," +
47 // ""postDate":"2013-01-30"," +
48 // ""message":"trying out Elasticsearch"" +
49 // "}";
50 try {
51
52
53 Map<String, Object> jsonMap = new HashMap<String, Object>();
54 jsonMap.put("name","jim"+id);
55 jsonMap.put("age",20+id);
56 jsonMap.put("date",new Date());
57 jsonMap.put("message","测试"+id);
58 jsonMap.put("tel","1234567");
59 //IndexResponse indexResponse = client.getConnection().prepareIndex("twitter", "tweet").setSource(JSONObject.toJSON(jsonMap), XContentType.JSON).get();
60 IndexResponse indexResponse = client.getConnection().prepareIndex("xiaot", "test",id).setSource(jsonMap).get();
61 // Index name
62 String _index = indexResponse.getIndex();
63 // Type name
64 String _type = indexResponse.getType();
65 // Document ID (generated or not)
66 String _id = indexResponse.getId();
67 // Version (if it's the first time you index this document, you will get: 1)
68 long _version = indexResponse.getVersion();
69 // status has stored current instance statement.
70 RestStatus status = indexResponse.status();
71 System.out.println(_index+"_"+_type+"_"+_id+"_"+_version+"_"+status);
72 }catch (Exception ex){
73 ex.printStackTrace();
74 }
75
76 }
77
78 public void get() {
79 GetResponse response = client.getConnection().prepareGet("twitter", "tweet", "94pKEWABJOgzR6sJVCCV").get();
80 Map<String, DocumentField> fields = response.getFields();
81 System.out.println("map:"+fields);
82 String index = response.getIndex();
83 Map<String, Object> source = response.getSource();
84 String id = response.getId();
85 System.out.println(source);
86
87 }
88
89 public void del(String id) {
90 DeleteByQueryAction.INSTANCE.newRequestBuilder(client.getConnection())
91 .filter(QueryBuilders.matchQuery("_id",id))
92 .source("twitter")
93 .execute(new ActionListener<BulkByScrollResponse>() {
94 public void onResponse(BulkByScrollResponse response) {
95 long deleted = response.getDeleted();
96 System.out.println("delete"+deleted);
97 }
98
99 public void onFailure(Exception e) {
100
101 }
102 });
103 }
104
105 public void update(String id) throws Exception{
106 client.getConnection().prepareUpdate("twitter","tweet",id)
107 .setDoc(jsonBuilder()
108 .startObject()
109 .field("name", "tom")
110 .endObject()).get();
111 }
112
113 public void multiGet(String... ids) throws Exception {
114 MultiGetResponse multiGetResponse = client.getConnection().prepareMultiGet()
115 .add("twitter", "tweet", ids[0])
116 .add("twitter", "tweet", ids[1], ids[2], ids[3])
117 .get();
118 for (MultiGetItemResponse multiGetItemResponse : multiGetResponse) {
119 GetResponse response = multiGetItemResponse.getResponse();
120 if (response.isExists()){
121 System.out.println(response.getSourceAsString());
122 }
123 }
124 }
125
126 public void bulk(String... ids) throws Exception {
127 BulkRequestBuilder prepareBulk = client.getConnection().prepareBulk();
128 for (String id : ids) {
129 prepareBulk.add(client.getConnection().prepareIndex("twitter","tweet",id)
130 .setSource(jsonBuilder().startObject().field("name","肖添"+id).endObject()));
131
132 }
133 BulkResponse responses = prepareBulk.get();
134 System.out.println(responses.hasFailures());
135 for (BulkItemResponse response : responses) {
136 System.out.println(response.getResponse().getId() + "," + response.getResponse().getIndex() + "," + response.getResponse().getResult());
137 }
138
139 }
140
141 public void bulkProcesstor(String index,String type,String... ids) throws Exception {
142 try {
143
144 //IndexResponse indexResponse = client.getConnection().prepareIndex(index, type).setSource(getMapping()).get();
145 IndexResponse indexResponse = client.getConnection().prepareIndex(index, type).setSource().get();
146
147 PutMappingRequest mappingRequest = Requests.putMappingRequest(index).type(type).source(getMapping());
148 PutMappingResponse putMappingResponse = client.getConnection().admin().indices().putMapping(mappingRequest).actionGet();
149 //client.getConnection().prepareIndex("temp1","test").
150 BulkProcessor bulkProcessor = BulkProcessor.builder(client.getConnection(), new BulkProcessor.Listener() {
151 public void beforeBulk(long executionId, BulkRequest bulkRequest) {
152 System.out.println("beforeBulk:" + executionId + "," + bulkRequest.getDescription() + "," + bulkRequest.numberOfActions());
153 }
154
155 public void afterBulk(long executionId, BulkRequest bulkRequest, BulkResponse bulkResponse) {
156 System.out.println("afterBulk:" + executionId + "," + bulkRequest.getDescription() + "," + bulkRequest.numberOfActions());
157 System.out.println("afterBulk:" + executionId + "," + bulkResponse.getItems() + "," + bulkResponse.getTook());
158 }
159
160 public void afterBulk(long executionId, BulkRequest bulkRequest, Throwable throwable) {
161 System.out.println("afterBulk:" + executionId + "," + bulkRequest.getParentTask() + "," + bulkRequest.getDescription() + "," + throwable);
162 }
163 })
164 .setBulkActions(10)
165 .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB))
166 .setConcurrentRequests(1)
167 .setFlushInterval(TimeValue.timeValueMillis(1))
168 .setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3)).build();
169
170 for (String id : ids) {
171 Map<String, Object> jsonMap = new HashMap<String, Object>();
172 jsonMap.put("name","中华人民共和国"+id);
173 jsonMap.put("age",30+Integer.parseInt(id));
174 jsonMap.put("date",new Date());
175 jsonMap.put("message","程序设计"+id);
176 jsonMap.put("tel","18612855433");
177 jsonMap.put("attr_name",new String[]{"品牌_sku_attr"+id,"商品类别_sku_attr"+id,"面料_sku_attr"+id});
178 jsonMap.put("create_date",new Date());
179 bulkProcessor.add(new IndexRequest(index,type,id).source(jsonMap));
180
181 }
182 bulkProcessor.close();
183 } catch (Exception e) {
184 e.printStackTrace();
185 System.out.println(e);
186 }finally {
187
188 }
189
190 }
191
192 private XContentBuilder getMapping() throws Exception{
193 XContentBuilder mapping = null;
194 try {
195
196 mapping = jsonBuilder().startObject()//.startObject("_ttl").field("enabled",false).endObject()
197 .startObject("properties").startObject("name").field("type","text").field("analyzer","ik_max_word")
198 .field("search_analyzer","ik_max_word").endObject()
199 .startObject("age").field("type","long").endObject()
200 .startObject("date").field("type","date").endObject()
201 .startObject("message").field("type","keyword").field("index","true").endObject()
202 .startObject("tel").field("type","keyword").endObject()
203 .startObject("attr_name").field("type","keyword").field("index","true").endObject()
204 .endObject()
205 .endObject();
206 } catch (IOException e) {
207 e.printStackTrace();
208 }
209
210 return mapping;
211 }
212 }
SearchServiceImpl
1 package com.elastic.service.impl; 2 3 import com.elastic.common.conn.EsClient; 4 import com.elastic.service.inter.SearchService; 5 import org.apache.lucene.index.Term; 6 import org.elasticsearch.action.search.MultiSearchResponse; 7 import org.elasticsearch.action.search.SearchRequestBuilder; 8 import org.elasticsearch.action.search.SearchResponse; 9 import org.elasticsearch.action.search.SearchType; 10 import org.elasticsearch.common.lucene.search.function.CombineFunction; 11 import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction; 12 import org.elasticsearch.index.query.*; 13 import org.elasticsearch.index.query.functionscore.*; 14 import org.elasticsearch.join.aggregations.Children; 15 import org.elasticsearch.script.Script; 16 import org.elasticsearch.script.ScriptService; 17 import org.elasticsearch.script.ScriptType; 18 import org.elasticsearch.search.SearchHit; 19 import org.elasticsearch.search.SearchHits; 20 import org.elasticsearch.search.aggregations.*; 21 import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; 22 import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregator; 23 import org.elasticsearch.search.aggregations.bucket.filter.InternalFilter; 24 import org.elasticsearch.search.aggregations.bucket.range.Range; 25 import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder; 26 import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator; 27 import org.elasticsearch.search.aggregations.bucket.terms.Terms; 28 import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; 29 import org.elasticsearch.search.aggregations.metrics.avg.Avg; 30 import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder; 31 import org.elasticsearch.search.aggregations.metrics.max.Max; 32 import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder; 33 import org.elasticsearch.search.aggregations.metrics.min.Min; 34 import org.elasticsearch.search.aggregations.metrics.min.MinAggregationBuilder; 35 import org.elasticsearch.search.aggregations.metrics.stats.Stats; 36 import org.elasticsearch.search.aggregations.metrics.stats.StatsAggregationBuilder; 37 import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats; 38 import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStatsAggregationBuilder; 39 import org.elasticsearch.search.aggregations.metrics.sum.Sum; 40 import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder; 41 import org.elasticsearch.search.rescore.RescoreBuilder; 42 import org.elasticsearch.search.sort.SortOrder; 43 import org.slf4j.Logger; 44 import org.springframework.beans.factory.annotation.Autowired; 45 import org.springframework.stereotype.Service; 46 47 import java.text.SimpleDateFormat; 48 import java.util.HashMap; 49 import java.util.List; 50 import java.util.Map; 51 52 import static org.elasticsearch.index.query.QueryBuilders.functionScoreQuery; 53 54 /** 55 * Created by xiaotian on 2017/12/2. 56 */ 57 @Service 58 public class SearchServiceImpl implements SearchService { 59 @Autowired 60 private EsClient client; 61 62 private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(SearchServiceImpl.class); 63 64 public void search() { 65 SearchResponse searchResponse = client.getConnection().prepareSearch("twitter") 66 .setTypes("tweet") 67 .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 68 .setQuery(QueryBuilders.matchQuery("name","三胖子")) 69 .setPostFilter(QueryBuilders.rangeQuery("age").from(19).to(400)) 70 .setFrom(0).setSize(20).setExplain(true) 71 //.addAggregation(AggregationBuilder.CommonFields.FIELD.match("")) 72 .get(); 73 74 SearchHits hits = searchResponse.getHits(); 75 for (SearchHit hit : hits) { 76 System.out.println(hit.getSourceAsMap()); 77 } 78 } 79 80 public void searchByCondition() throws Exception{ 81 82 83 SearchRequestBuilder searchRequestBuilder = client.getConnection().prepareSearch("red89") 84 .setTypes("test"); 85 86 87 Map<String, Object> params = new HashMap<>(); 88 params.put("num1", 1); 89 params.put("num2", 2); 90 91 String inlineScript = "long age;if (doc['age'].value < 45) age = doc['age'].value + 50; return age * params.num1;"; 92 // + "return (diff +num1+num2)"; 93 Script script = new Script(ScriptType.INLINE,"painless",inlineScript , params); 94 ScriptScoreFunctionBuilder scriptScoreFunctionBuilder = ScoreFunctionBuilders.scriptFunction(script); 95 96 97 98 //MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "中华"); 99 100 searchRequestBuilder.setQuery(functionScoreQuery(QueryBuilders.matchQuery("name","中华").operator(Operator.AND),scriptScoreFunctionBuilder)); 101 // searchRequestBuilder.setQuery(QueryBuilders.matchQuery("name","中华").operator(Operator.AND)); 102 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); 103 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); 104 getFilterQuery("tel",new String[]{"18612855433"},"AND",queryBuilder); 105 // getFilterQuery("name",new String[]{"中华人民共和国"},"AND",queryBuilder); 106 107 108 //getFilterQuery("age",new String[]{"40"},"AND",queryBuilder); 109 //getFilterQuery("message",new String[]{"程序设计19"},"AND",queryBuilder); 110 boolQueryBuilder.must(queryBuilder); 111 //boolQueryBuilder.must(); 112 // boolQueryBuilder.must(getRangeFilterQuery("age",new Integer[]{null,45})); 113 //new_score = old_score * log(1 + factor * number_of_votes) 114 115 FieldValueFactorFunctionBuilder age = ScoreFunctionBuilders.fieldValueFactorFunction("age").modifier(FieldValueFactorFunction.Modifier.LN1P).factor(10); 116 FieldValueFactorFunctionBuilder age1 = ScoreFunctionBuilders.fieldValueFactorFunction("age").modifier(FieldValueFactorFunction.Modifier.LN1P).factor(4); 117 FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = 118 new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(age),new FunctionScoreQueryBuilder.FilterFunctionBuilder(age1)}; 119 //FunctionScoreQueryBuilder scoreQueryBuilder = functionScoreQuery(boolQueryBuilder, filterFunctionBuilders).boostMode(CombineFunction.SUM); 120 121 // FunctionScoreQueryBuilder functionScoreQueryBuilder = functionScoreQuery(boolQueryBuilder, scriptScoreFunctionBuilder); 122 searchRequestBuilder.setPostFilter(boolQueryBuilder); 123 searchRequestBuilder.setFrom(0); 124 searchRequestBuilder.setSize(20); 125 searchRequestBuilder.setExplain(true); 126 127 TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").field("attr_name");//.subAggregation(AggregationBuilders.topHits("top").from(0).size(10)).size(100); 128 RangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("range").field("age").addRange(0, 30).addRange(30,50).addRange(50,100); 129 130 aggregationBuilder.size(100); 131 132 AggregationBuilder filter = AggregationBuilders.filter("agg", boolQueryBuilder) 133 .subAggregation(aggregationBuilder); 134 135 searchRequestBuilder.addAggregation(filter); 136 searchRequestBuilder.addAggregation(rangeAggregationBuilder); 137 // searchRequestBuilder.addAggregation(filter); 138 //searchRequestBuilder.addSort("age",SortOrder.DESC); 139 140 141 142 143 144 //打分 145 //searchRequestBuilder.addRescorer(RescoreBuilder.queryRescorer(QueryBuilders.functionScoreQuery(ScoreFunctionBuilders.fieldValueFactorFunction("age")))); 146 147 SearchResponse searchResponse1 = searchRequestBuilder.get(); 148 149 150 System.out.println("param:"+searchRequestBuilder.toString()); 151 152 153 154 System.out.println("aaaa"+searchResponse1.getAggregations().getAsMap()); 155 156 157 InternalFilter aggFilter = searchResponse1.getAggregations().get("agg"); 158 System.out.println(aggFilter.toString()); 159 Terms agg = aggFilter.getAggregations().get("agg"); 160 161 agg.getBuckets().forEach(bucket ->{ 162 System.out.println(bucket.getKey()+":"+bucket.getDocCount()); 163 } ); 164 System.out.println("--------------------------------"); 165 Range range = searchResponse1.getAggregations().get("range"); 166 167 range.getBuckets().forEach(bucket ->{ 168 //System.out.println(bucket.getKey()+":"+bucket.getDocCount()); 169 //logger.info("key [{}], from [{}], to [{}], doc_count [{}]", bucket.getKey(), bucket.getFrom(),bucket.getTo(),bucket.getDocCount()); 170 System.out.println(String.format("key [%s], from [%s], to [%s], doc_count [%d]", bucket.getKey(), bucket.getFrom(),bucket.getTo(),bucket.getDocCount())); 171 172 }); 173 174 SearchHits hits = searchResponse1.getHits(); 175 for (SearchHit hit : hits) { 176 System.out.println(hit.getSourceAsMap()); 177 } 178 179 System.out.println("---------------------"); 180 181 // 182 // SearchRequestBuilder searchRequestBuilder1 = client.getConnection().prepareSearch("red88") 183 // .setTypes("test"); 184 //// QueryBuilder tel = QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("tel","18612855433")).should(QueryBuilders.matchQuery("message","程序设计")); 185 //// BoolQueryBuilder filter1 = QueryBuilders.boolQuery()//.must(QueryBuilders.matchQuery("age", "40").operator(Operator.AND)) 186 //// .must(QueryBuilders.rangeQuery("age").from(0).to(40)) 187 //// .must(tel); 188 // searchRequestBuilder.setQuery(QueryBuilders.matchQuery("name","三胖子").operator(Operator.AND)); 189 // BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery(); 190 // BoolQueryBuilder queryBuilder1 = QueryBuilders.boolQuery(); 191 // getFilterQuery("tel",new String[]{"18612855433"},"OR",queryBuilder1); 192 // getFilterQuery("message",new String[]{"程序设计"},"OR",queryBuilder1); 193 // boolQueryBuilder.must(queryBuilder); 194 // //boolQueryBuilder.must(); 195 // boolQueryBuilder.must(getRangeFilterQuery("age",new Integer[]{null,40})); 196 // searchRequestBuilder.setPostFilter(boolQueryBuilder1); 197 // searchRequestBuilder.setFrom(0); 198 // searchRequestBuilder.setSize(20); 199 // searchRequestBuilder.setExplain(true); 200 // TermsAggregationBuilder aggregationBuilder1 = AggregationBuilders.terms("agg").field("attr_name"); 201 // 202 // aggregationBuilder.size(100); 203 // searchRequestBuilder.addAggregation(aggregationBuilder); 204 // searchRequestBuilder.addSort("age",SortOrder.DESC); 205 // 206 207 208 209 210 } 211 212 public FunctionScoreQueryBuilder sortByFucntion(QueryBuilder queryBuilder) { 213 FunctionScoreQueryBuilder query = functionScoreQuery(queryBuilder, 214 ScoreFunctionBuilders.fieldValueFactorFunction("age").modifier(FieldValueFactorFunction.Modifier.LN1P).factor(1f)).boostMode(CombineFunction.SUM); 215 //.add(ScoreFunctionBuilders.fieldValueFactorFunction(查询字段).modifier(Modifier.RECIPROCAL).factor(1)).boostMode(“sum”); 216 return query; 217 } 218 private QueryBuilder getFilterQuery(String fieldName, Object[] fieldValues,String andor,BoolQueryBuilder queryBuilder) { 219 //BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); 220 221 for (int i = 0; i < fieldValues.length; i++) { 222 if ("OR".equals(andor)){ 223 queryBuilder.should(QueryBuilders.matchQuery(fieldName,fieldValues[i]).operator(Operator.OR)); 224 }else if ("AND".equals(andor)){ 225 queryBuilder.must(QueryBuilders.matchQuery(fieldName,fieldValues[i]).operator(Operator.AND)); 226 } 227 } 228 229 return queryBuilder; 230 231 } 232 private QueryBuilder getFilterQuery(String fieldName, Object[] fieldValues,String andor) { 233 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); 234 235 for (int i = 0; i < fieldValues.length; i++) { 236 if ("OR".equals(andor)){ 237 boolQueryBuilder.should(QueryBuilders.matchQuery(fieldName,fieldValues[i])); 238 }else if ("AND".equals(andor)){ 239 boolQueryBuilder.must(QueryBuilders.matchQuery(fieldName,fieldValues[i])); 240 } 241 } 242 243 return boolQueryBuilder; 244 245 } 246 247 private RangeQueryBuilder getRangeFilterQuery(String fieldName, Integer[] values) { 248 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(fieldName); 249 rangeQueryBuilder.from(values[0]==null?0:values[0]); 250 rangeQueryBuilder.to((values.length<2||values[1]==null)?99999999:values[1]); 251 return rangeQueryBuilder; 252 } 253 254 255 public void multiSearch() { 256 257 SearchRequestBuilder srb1 = client.getConnection().prepareSearch().setQuery(QueryBuilders.matchQuery("name", "tom")).setSize(1); 258 SearchRequestBuilder srb2 = client.getConnection().prepareSearch().setQuery(QueryBuilders.matchQuery("name", "三胖子")).setSize(1); 259 MultiSearchResponse multiSearchResponse = client.getConnection().prepareMultiSearch() 260 .add(srb1) 261 .add(srb2) 262 .get(); 263 264 for (MultiSearchResponse.Item item : multiSearchResponse.getResponses()) { 265 for (SearchHit hit : item.getResponse().getHits().getHits()) { 266 System.out.println(hit.getSourceAsMap()); 267 268 } 269 } 270 271 } 272 273 public void aggsearch() { 274 SearchRequestBuilder requestBuilder = client.getConnection().prepareSearch("twitter").setTypes("tweet") 275 .setFrom(0).setSize(100); 276 AggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").field("name").subAggregation(AggregationBuilders.terms("add").field("age")); 277 SearchResponse response = requestBuilder.setQuery(QueryBuilders.matchQuery("name", "三胖")) 278 .addAggregation(aggregationBuilder) 279 .addSort("age", SortOrder.DESC) 280 .setExplain(true).execute().actionGet(); 281 SearchHits searchHits = response.getHits(); 282 283 Terms agg = response.getAggregations().get("agg"); 284 Children children = response.getAggregations().get("agg"); 285 System.out.println(agg.getBuckets()); 286 for (Terms.Bucket bucket : agg.getBuckets()) { 287 System.out.println(bucket.getKey() + ":" + bucket.getDocCount()); 288 } 289 System.out.println(children.getAggregations().getAsMap()); 290 291 } 292 293 public void metricsAgg() { 294 295 SearchRequestBuilder searchRequestBuilder = client.getConnection().prepareSearch("hello").setTypes("test").setFrom(0).setSize(100); 296 MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("agg").field("age"); 297 SearchResponse response = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()) 298 .addAggregation(minAggregationBuilder).setExplain(true).execute().actionGet(); 299 Min min = response.getAggregations().get("agg"); 300 System.out.println("min:"+min.getValue()); 301 MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("max_age").field("age"); 302 SearchResponse response1 = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()) 303 .addAggregation(maxAggregationBuilder).setExplain(true).execute().actionGet(); 304 Max max_age = response1.getAggregations().get("max_age"); 305 System.out.println("max:"+max_age.getValue()); 306 307 AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_age").field("age"); 308 SearchResponse response2 = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()) 309 .addAggregation(avgAggregationBuilder).setExplain(true).execute().actionGet(); 310 Avg avg_age = response2.getAggregations().get("avg_age"); 311 System.out.println("avg_age:"+avg_age.getValue()); 312 313 SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_age").field("age"); 314 SearchResponse searchResponse = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()).addAggregation(sumAggregationBuilder) 315 .setExplain(true).execute().actionGet(); 316 Sum sum_age = searchResponse.getAggregations().get("sum_age"); 317 System.out.println("sum_age:"+sum_age.getValue()); 318 319 System.out.println("---------------------------"); 320 321 StatsAggregationBuilder statsAggregationBuilder = AggregationBuilders.stats("agg_status").field("age"); 322 SearchResponse searchResponse1 = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()).addAggregation(statsAggregationBuilder) 323 .setExplain(true).execute().actionGet(); 324 325 Stats agg_status = searchResponse1.getAggregations().get("agg_status"); 326 double min1 = agg_status.getMin(); 327 double max = agg_status.getMax(); 328 long count = agg_status.getCount(); 329 double sum = agg_status.getSum(); 330 double avg = agg_status.getAvg(); 331 System.out.println("---------------------------------"); 332 System.out.println("min1="+min1); 333 System.out.println("max="+max); 334 System.out.println("count="+count); 335 System.out.println("sum="+sum); 336 System.out.println("avg="+avg); 337 338 ExtendedStatsAggregationBuilder extendedStatsAggregationBuilder = AggregationBuilders.extendedStats("extend_status").field("age"); 339 340 SearchResponse searchResponse2 = searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()).addAggregation(extendedStatsAggregationBuilder).setExplain(true).execute().actionGet(); 341 ExtendedStats extend_status = searchResponse2.getAggregations().get("extend_status"); 342 double extend_min = extend_status.getMin(); 343 double extend_max = extend_status.getMax(); 344 long extend_count = extend_status.getCount(); 345 double extend_sum = extend_status.getSum(); 346 double extend_avg = extend_status.getAvg(); 347 System.out.println("---------------------------------"); 348 System.out.println("extend_min="+extend_min); 349 System.out.println("extend_max="+extend_max); 350 System.out.println("extend_count="+extend_count); 351 System.out.println("extend_sum="+extend_sum); 352 System.out.println("extend_avg="+extend_avg); 353 354 355 } 356 }
3.1 controller层实现
IndexController
1 package com.elastic.controller;
2
3 import com.elastic.service.inter.IndexService;
4 import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.stereotype.Controller;
6 import org.springframework.web.bind.annotation.RequestMapping;
7
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10 import java.io.IOException;
11
12 /**
13 * Created by xiaotian on 2017/12/1.
14 */
15 @Controller
16 public class IndexController {
17
18 @Autowired
19 private IndexService indexService;
20
21 @RequestMapping("/index")
22 public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
23
24 indexService.index(request.getParameter("id"));
25 }
26 @RequestMapping("/get")
27 public void get(){
28
29 indexService.get();
30 }
31
32 @RequestMapping("/del")
33 public void get(HttpServletRequest request, HttpServletResponse response) throws IOException {
34
35 indexService.del(request.getParameter("id"));
36 }
37 @RequestMapping("/update")
38 public void update(HttpServletRequest request, HttpServletResponse response) throws Exception {
39
40 indexService.update(request.getParameter("id"));
41 }
42 @RequestMapping("/multiGet")
43 public void multiGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
44
45 indexService.multiGet(request.getParameter("id").split(","));
46 }
47 @RequestMapping("/bulk")
48 public void bulk(HttpServletRequest request, HttpServletResponse response) throws Exception {
49
50 indexService.bulk(request.getParameter("id").split(","));
51 }
52 @RequestMapping("/bulkP")
53 public void bulkProcesstor(HttpServletRequest request, HttpServletResponse response) throws Exception {
54 String index = request.getParameter("index");
55 String type = request.getParameter("type");
56 String[] ids = request.getParameter("id").split(",");
57 indexService.bulkProcesstor(index,type,ids);
58 }
59 }
SearchController
1 package com.elastic.controller;
2
3 import com.elastic.service.inter.SearchService;
4 import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.stereotype.Controller;
6 import org.springframework.web.bind.annotation.RequestMapping;
7
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10 import java.io.IOException;
11
12 /**
13 * Created by xiaotian on 2017/12/2.
14 */
15 @Controller
16 public class SearchController {
17
18 @Autowired
19 private SearchService searchService;
20 @RequestMapping("/search")
21 public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
22
23 searchService.search();
24 }
25 @RequestMapping("/multiSearch")
26 public void multiSearch(HttpServletRequest request, HttpServletResponse response) throws IOException {
27
28 searchService.multiSearch();
29 }
30 @RequestMapping("/aggsearch")
31 public void aggsearch(HttpServletRequest request, HttpServletResponse response) throws IOException {
32
33 searchService.aggsearch();
34 }
35
36 @RequestMapping("/metricsAgg")
37 public void metricsAgg(HttpServletRequest request, HttpServletResponse response) throws IOException {
38
39 searchService.metricsAgg();
40 }
41 @RequestMapping("/searchFilter")
42 public void searchByCondition(HttpServletRequest request, HttpServletResponse response) throws Exception {
43
44 searchService.searchByCondition();
45 }
46 }
4. 通过kibana进行索引建立和查询等
1 GET red89/test/_search
2
3 {
4 "from" : 0,
5 "size" : 20,
6 "query" : {
7 "match" : {
8 "name" : {
9 "query" : "中华",
10 "operator" : "AND",
11 "prefix_length" : 0,
12 "max_expansions" : 50,
13 "fuzzy_transpositions" : true,
14 "lenient" : false,
15 "zero_terms_query" : "NONE",
16 "boost" : 1.0
17 }
18 }
19 },
20 "post_filter" : {
21 "bool" : {
22 "must" : [
23 {
24 "bool" : {
25 "should" : [
26 {
27 "match" : {
28 "tel" : {
29 "query" : "18612855433",
30 "operator" : "OR",
31 "prefix_length" : 0,
32 "max_expansions" : 50,
33 "fuzzy_transpositions" : true,
34 "lenient" : false,
35 "zero_terms_query" : "NONE",
36 "boost" : 1.0
37 }
38 }
39 }
40 ],
41 "adjust_pure_negative" : true,
42 "boost" : 1.0
43 }
44 },
45 {
46 "range" : {
47 "age" : {
48 "from" : 0,
49 "to" : 45,
50 "include_lower" : true,
51 "include_upper" : true,
52 "boost" : 1.0
53 }
54 }
55 }
56 ],
57 "adjust_pure_negative" : true,
58 "boost" : 1.0
59 }
60 },
61 "explain" : true,
62 "aggregations" : {
63 "agg" : {
64 "filter" : {
65 "bool" : {
66 "must" : [
67 {
68 "bool" : {
69 "should" : [
70 {
71 "match" : {
72 "tel" : {
73 "query" : "18612855433",
74 "operator" : "OR",
75 "prefix_length" : 0,
76 "max_expansions" : 50,
77 "fuzzy_transpositions" : true,
78 "lenient" : false,
79 "zero_terms_query" : "NONE",
80 "boost" : 1.0
81 }
82 }
83 }
84 ],
85 "adjust_pure_negative" : true,
86 "boost" : 1.0
87 }
88 },
89 {
90 "range" : {
91 "age" : {
92 "from" : 0,
93 "to" : 45,
94 "include_lower" : true,
95 "include_upper" : true,
96 "boost" : 1.0
97 }
98 }
99 }
100 ],
101 "adjust_pure_negative" : true,
102 "boost" : 1.0
103 }
104 },
105 "aggregations" : {
106 "agg" : {
107 "terms" : {
108 "field" : "attr_name",
109 "size" : 100,
110 "min_doc_count" : 1,
111 "shard_min_doc_count" : 0,
112 "show_term_doc_count_error" : false,
113 "order" : [
114 {
115 "_count" : "desc"
116 },
117 {
118 "_key" : "asc"
119 }
120 ]
121 }
122 }
123 }
124 },
125 "range" : {
126 "range" : {
127 "field" : "age",
128 "ranges" : [
129 {
130 "from" : 0.0,
131 "to" : 30.0
132 },
133 {
134 "from" : 30.0,
135 "to" : 50.0
136 },
137 {
138 "from" : 50.0,
139 "to" : 100.0
140 }
141 ],
142 "keyed" : false
143 }
144 }
145 }
146 }
查询结果:
1 {
2 "took": 1,
3 "timed_out": false,
4 "_shards": {
5 "total": 5,
6 "successful": 5,
7 "skipped": 0,
8 "failed": 0
9 },
10 "hits": {
11 "total": 21,
12 "max_score": 1,
13 "hits": [
14 {
15 "_index": "red89",
16 "_type": "test",
17 "_id": "14",
18 "_score": 1,
19 "_source": {
20 "date": "2017-12-11T09:55:42.261Z",
21 "attr_name": [
22 "品牌_sku_attr14",
23 "商品类别_sku_attr14",
24 "面料_sku_attr14"
25 ],
26 "name": "中华人民共和国14",
27 "tel": "18612855433",
28 "message": "程序设计14",
29 "create_date": "2017-12-11T09:55:42.261Z",
30 "age": 44
31 }
32 },
33 {
34 "_index": "red89",
35 "_type": "test",
36 "_id": "19",
37 "_score": 1,
38 "_source": {
39 "date": "2017-12-11T09:55:42.261Z",
40 "attr_name": [
41 "品牌_sku_attr19",
42 "商品类别_sku_attr19",
43 "面料_sku_attr19"
44 ],
45 "name": "中华人民共和国19",
46 "tel": "18612855433",
47 "message": "程序设计19",
48 "create_date": "2017-12-11T09:55:42.261Z",
49 "age": 49
50 }
51 },
52 {
53 "_index": "red89",
54 "_type": "test",
55 "_id": "5",
56 "_score": 1,
57 "_source": {
58 "date": "2017-12-11T09:55:42.257Z",
59 "attr_name": [
60 "品牌_sku_attr5",
61 "商品类别_sku_attr5",
62 "面料_sku_attr5"
63 ],
64 "name": "中华人民共和国5",
65 "tel": "18612855433",
66 "message": "程序设计5",
67 "create_date": "2017-12-11T09:55:42.257Z",
68 "age": 35
69 }
70 },
71 {
72 "_index": "red89",
73 "_type": "test",
74 "_id": "8",
75 "_score": 1,
76 "_source": {
77 "date": "2017-12-11T09:55:42.257Z",
78 "attr_name": [
79 "品牌_sku_attr8",
80 "商品类别_sku_attr8",
81 "面料_sku_attr8"
82 ],
83 "name": "中华人民共和国8",
84 "tel": "18612855433",
85 "message": "程序设计8",
86 "create_date": "2017-12-11T09:55:42.257Z",
87 "age": 38
88 }
89 },
90 {
91 "_index": "red89",
92 "_type": "test",
93 "_id": "9",
94 "_score": 1,
95 "_source": {
96 "date": "2017-12-11T09:55:42.257Z",
97 "attr_name": [
98 "品牌_sku_attr9",
99 "商品类别_sku_attr9",
100 "面料_sku_attr9"
101 ],
102 "name": "中华人民共和国9",
103 "tel": "18612855433",
104 "message": "程序设计9",
105 "create_date": "2017-12-11T09:55:42.257Z",
106 "age": 39
107 }
108 },
109 {
110 "_index": "red89",
111 "_type": "test",
112 "_id": "10",
113 "_score": 1,
114 "_source": {
115 "date": "2017-12-11T09:55:42.257Z",
116 "attr_name": [
117 "品牌_sku_attr10",
118 "商品类别_sku_attr10",
119 "面料_sku_attr10"
120 ],
121 "name": "中华人民共和国10",
122 "tel": "18612855433",
123 "message": "程序设计10",
124 "create_date": "2017-12-11T09:55:42.257Z",
125 "age": 40
126 }
127 },
128 {
129 "_index": "red89",
130 "_type": "test",
131 "_id": "12",
132 "_score": 1,
133 "_source": {
134 "date": "2017-12-11T09:55:42.261Z",
135 "attr_name": [
136 "品牌_sku_attr12",
137 "商品类别_sku_attr12",
138 "面料_sku_attr12"
139 ],
140 "name": "中华人民共和国12",
141 "tel": "18612855433",
142 "message": "程序设计12",
143 "create_date": "2017-12-11T09:55:42.261Z",
144 "age": 42
145 }
146 },
147 {
148 "_index": "red89",
149 "_type": "test",
150 "_id": "ZraQK2ABrThwqnonhOO3",
151 "_score": 1,
152 "_source": {}
153 },
154 {
155 "_index": "red89",
156 "_type": "test",
157 "_id": "2",
158 "_score": 1,
159 "_source": {
160 "date": "2017-12-11T09:55:42.256Z",
161 "attr_name": [
162 "品牌_sku_attr2",
163 "商品类别_sku_attr2",
164 "面料_sku_attr2"
165 ],
166 "name": "中华人民共和国2",
167 "tel": "18612855433",
168 "message": "程序设计2",
169 "create_date": "2017-12-11T09:55:42.256Z",
170 "age": 32
171 }
172 },
173 {
174 "_index": "red89",
175 "_type": "test",
176 "_id": "4",
177 "_score": 1,
178 "_source": {
179 "date": "2017-12-11T09:55:42.257Z",
180 "attr_name": [
181 "品牌_sku_attr4",
182 "商品类别_sku_attr4",
183 "面料_sku_attr4"
184 ],
185 "name": "中华人民共和国4",
186 "tel": "18612855433",
187 "message": "程序设计4",
188 "create_date": "2017-12-11T09:55:42.257Z",
189 "age": 34
190 }
191 }
192 ]
193 }
194 }