spuerx 9 лет назад
Родитель
Сommit
72623f388a

+ 286 - 0
create_index.sh

@@ -0,0 +1,286 @@
+#!/usr/bin/env bash
+curl -XDELETE 'http://192.168.0.109:9200/index/'
+
+curl -XPUT 'http://192.168.0.109:9200/index/' -d '{
+	"settings": {
+		"index": {
+			"number_of_shards": 1,
+			"number_of_replicas": 3
+		}
+	},
+	"mappings": {
+		"library": {
+			"properties": {
+				"name": {
+					"type": "string",
+					"index": "not_analyzed"
+				},
+				"manager": {
+					"type": "object",
+					"properties": {
+						"managerName": {
+							"type": "string",
+							"index": "not_analyzed"
+						},
+						"floors": {
+							"type": "nested",
+							"properties": {
+								"floorNum": {
+									"type": "integer"
+								},
+								"area": {
+									"type": "string",
+									"index": "not_analyzed"
+								}
+							}
+						}
+					}
+				},
+				"bookCategories": {
+					"type": "nested",
+					"properties": {
+						"categoryName": {
+							"type": "string",
+							"index": "not_analyzed"
+						},
+						"categoryCode": {
+							"type": "string",
+							"index": "not_analyzed"
+						},
+						"books": {
+							"type": "nested",
+							"properties": {
+								"bookStock": {
+									"type": "integer"
+								},
+								"bookAuthor": {
+									"type": "string",
+									"index": "not_analyzed"
+								},
+								"bookName": {
+									"type": "string",
+									"index": "not_analyzed"
+								},
+								"bookPublisher" : {
+								    "type" : "object",
+								    "properties" : {
+								        "publisherName" : {
+								            "type" : "string",
+								            "index": "not_analyzed"
+								        },
+								        "publisherCode" : {
+								            "type" : "string",
+								            "index": "not_analyzed"
+								        },
+								        "bookProvider" : {
+                                            "type" : "nested",
+                                            "properties" : {
+                                                "providerName" : {
+                                                    "type" : "string",
+								                    "index": "not_analyzed"
+                                                }
+                                            }
+                                        }
+                                    }
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}'
+
+
+curl -XPUT 'http://192.168.0.109:9200/index/library/1' -d '{
+	"name": "HBUT",
+	"manager": {
+		"managerName": "CN",
+		"floors": [{
+			"floorNum": 1,
+			"area": ["A","B"]
+		},
+		{
+			"floorNum": 2,
+			"area": ["A","B","C"]
+		}]
+	},
+	"bookCategories": [{
+		"categoryName": "IT",
+		"categoryCode": "C001",
+		"books": [{
+			"bookName": "Java Core",
+			"bookStock": 22,
+			"bookAuthor": "jason"
+		},
+		{
+			"bookName": "Multi Thread",
+			"bookStock": 12,
+			"bookAuthor": "jason"
+		}]
+	},
+	{
+		"categoryName": "ART",
+		"categoryCode": "C002",
+		"books": [{
+			"bookName": "Chinese 5000",
+			"bookStock": 13,
+			"bookAuthor": "bibic"
+		},
+		{
+			"bookName": "qgjq",
+			"bookStock": 18,
+			"bookAuthor": "lcy"
+		}]
+	}]
+}'
+
+
+
+curl -XPUT 'http://192.168.0.109:9200/index/library/2' -d '{
+	"name" : "HZKJDX",
+	"manager" : {
+		"managerName": "lcy",
+		"floors": [{
+			"floorNum" : 1,
+			"area" : ["M", "X"]
+		},
+		{
+			"floorNum" : 2,
+			"area" : ["A"]
+		},
+		{
+			"floorNum" : 4,
+			"area" : ["N"]
+		}]
+	},
+	"bookCategories" : [{
+		"categoryName" : "NEWS",
+		"categoryCode" : "C001",
+		"books" : [{
+			"bookName" : "cqcb",
+			"bookStock" : 22,
+			"bookAuthor" : "cq"
+		},
+		{
+			"bookName" : "yyxw",
+			"bookStock" : 12,
+			"bookAuthor" : "cq"
+		}]
+	},
+	{
+		"categoryName" : "ART",
+		"categoryCode" : "C002",
+		"books" : [{
+			"bookName" : "Cinese 5000",
+			"bookStock" : 13,
+			"bookAuthor" : "bibicx",
+			"bookPublisher" : {
+			    "publisherName" : "CQ_PUB",
+			    "publisherCode" : "PUB_03",
+			    "bookProvider" : [{
+                    "providerName" : "PVD_01"
+                }]
+			}
+		},
+		{
+			"bookName" : "qgjq",
+			"bookStock" : 18,
+			"bookAuthor" : "lcy"
+		}]
+	}]
+}'
+
+
+curl -XPOST 'http://192.168.0.109:9200/index/_refresh'
+
+
+
+curl -XPOST 'http://192.168.0.109:9200/index/_search' -d '{
+  "query": {
+    "filtered": {
+      "filter": {
+        "nested": {
+          "path": "bookCategories",
+          "filter": {
+            "bool": {
+              "must": [
+                {
+                  "term": {
+                    "bookCategories.categoryName": "ART"
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }
+    }
+  }
+}'
+
+
+curl -XPOST 'http://192.168.0.109:9200/index/_search' -d '{
+  "query": {
+    "filtered": {
+      "filter": {
+        "nested": {
+          "path": "manager.floors",
+          "filter": {
+            "bool": {
+              "must": [
+                {
+                  "term": {
+                    "manager.floors.floorNum": 1
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }
+    }
+  }
+}'
+
+
+curl -XPOST 'http://192.168.0.109:9200/index/_search' -d '{
+  "query": {
+    "filtered": {
+      "filter": {
+        "nested": {
+          "filter": {
+            "bool": {
+              "must": [
+                {
+                  "term": {
+                    "bookCategories.categoryName": "ART"
+                  }
+                },
+                {
+                  "nested": {
+                    "filter": {
+                      "bool": {
+                        "must": {
+                          "terms": {
+                            "bookCategories.books.bookAuthor": [
+                              "bibicx"
+                            ]
+                          }
+                        }
+                      }
+                    },
+                    "path": "bookCategories.books"
+                  }
+                }
+              ]
+            }
+          },
+          "path": "bookCategories"
+        }
+      }
+    }
+  }
+}'
+

+ 2 - 0
src/main/java/org/elasticsearch/dsl/ParseActionListener.java

@@ -1,5 +1,7 @@
 package org.elasticsearch.dsl;
 
+import org.elasticsearch.dsl.enums.SQLConditionOperator;
+
 public interface ParseActionListener {
 
     void onSelectFieldParse(ElasticSqlIdentifier field);

+ 2 - 0
src/main/java/org/elasticsearch/dsl/ParseActionListenerAdapter.java

@@ -1,5 +1,7 @@
 package org.elasticsearch.dsl;
 
+import org.elasticsearch.dsl.enums.SQLConditionOperator;
+
 public class ParseActionListenerAdapter implements ParseActionListener {
 
     @Override

+ 2 - 1
src/main/java/org/elasticsearch/dsl/SqlConditionOperator.java

@@ -1,4 +1,5 @@
-package org.elasticsearch.dsl;
+package org.elasticsearch.dsl.enums;
+
 
 public enum SQLConditionOperator {
     Equality,

+ 5 - 1
src/main/java/org/elasticsearch/dsl/parser/QueryWhereConditionParser.java

@@ -4,7 +4,11 @@ import com.alibaba.druid.sql.ast.SQLExpr;
 import com.alibaba.druid.sql.ast.expr.*;
 import com.google.common.collect.Lists;
 import org.apache.commons.collections.CollectionUtils;
-import org.elasticsearch.dsl.*;
+import org.elasticsearch.dsl.ElasticDslContext;
+import org.elasticsearch.dsl.ElasticSqlIdentifier;
+import org.elasticsearch.dsl.ElasticSqlParseUtil;
+import org.elasticsearch.dsl.ParseActionListener;
+import org.elasticsearch.dsl.enums.SQLConditionOperator;
 import org.elasticsearch.dsl.exception.ElasticSql2DslException;
 import org.elasticsearch.dsl.parser.helper.ElasticSqlIdentifierHelper;
 import org.elasticsearch.index.query.BoolFilterBuilder;

+ 5 - 1
src/test/java/org/elasticsearch/SqlParserListenerTest.java

@@ -1,7 +1,11 @@
 package org.elasticsearch;
 
 import com.google.common.collect.Lists;
-import org.elasticsearch.dsl.*;
+import org.elasticsearch.dsl.ElasticSql2DslParser;
+import org.elasticsearch.dsl.ElasticSqlIdentifier;
+import org.elasticsearch.dsl.ElasticSqlParseResult;
+import org.elasticsearch.dsl.ParseActionListenerAdapter;
+import org.elasticsearch.dsl.enums.SQLConditionOperator;
 import org.junit.Test;
 
 import java.util.List;

+ 55 - 1
src/test/java/org/elasticsearch/SqlParserWhereConditionTest.java

@@ -1,14 +1,21 @@
 package org.elasticsearch;
 
+import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.dsl.ElasticSql2DslParser;
 import org.elasticsearch.dsl.ElasticSqlParseResult;
 import org.elasticsearch.index.query.FilterBuilder;
 import org.elasticsearch.index.query.FilterBuilders;
+import org.elasticsearch.index.query.NestedFilterBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
+import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
+import org.elasticsearch.util.ElasticMockClient;
 import org.junit.Assert;
 import org.junit.Test;
 
 
-public class SqlParserWhereConditionTest  {
+public class SqlParserWhereConditionTest {
     @Test
     public void testParseEqExpr() {
         String sql = "select id,productStatus from index.trx_order trx where trx.status='SUCCESS'";
@@ -135,4 +142,51 @@ public class SqlParserWhereConditionTest  {
         ElasticSqlParseResult parseResult = sql2DslParser.parse(sql, new Object[]{"RM", "CX"});
         System.out.println(parseResult.toString());
     }
+
+
+    @Test
+    public void testCreateSearchDsl() {
+        SearchRequestBuilder searchReq = new SearchRequestBuilder(new ElasticMockClient());
+
+        NestedFilterBuilder categoryNameTerm = FilterBuilders.nestedFilter("bookCategories", FilterBuilders.termFilter("bookCategories.categoryName", "ART"));
+        NestedFilterBuilder bookAuthorNestedFilter = FilterBuilders.nestedFilter("bookCategories.books", FilterBuilders.termsFilter("bookCategories.books.bookAuthor", "bibicx"));
+        NestedFilterBuilder bookPublisherCodeNestedFilter = FilterBuilders.nestedFilter("bookCategories.books", FilterBuilders.termsFilter("bookCategories.books.bookPublisher.publisherCode", "PUB_03"));
+        NestedFilterBuilder bookProviderNameNestedFilter = FilterBuilders.nestedFilter("bookCategories.books.bookPublisher.bookProvider", FilterBuilders.termsFilter("bookCategories.books.bookPublisher.bookProvider.providerName", "PVD_01"));
+
+        FilterBuilder topFilter = FilterBuilders.boolFilter().must(categoryNameTerm).must(bookAuthorNestedFilter).must(bookPublisherCodeNestedFilter).must(bookProviderNameNestedFilter);
+
+        searchReq.setQuery(QueryBuilders.filteredQuery(null, topFilter));
+
+        System.out.println(searchReq);
+
+    }
+
+    @Test
+    public void testCreateAggDsl() {
+        SearchRequestBuilder searchReq = new SearchRequestBuilder(new ElasticMockClient());
+        searchReq.setSize(0);
+
+        //NestedFilterBuilder categoryNameTerm = FilterBuilders.nestedFilter("bookCategories", FilterBuilders.termFilter("bookCategories.categoryName", "ART"));
+        TermsBuilder categoryNameAgg = AggregationBuilders.terms("agg_bookCategories.categoryName").field("bookCategories.categoryName");
+        AbstractAggregationBuilder topAgg = AggregationBuilders.nested("nested_bookCategories.categoryName").path("bookCategories").subAggregation(categoryNameAgg);
+
+        AbstractAggregationBuilder rtnAgg = AggregationBuilders.reverseNested("rtn_root").subAggregation(AggregationBuilders.terms("agg_name").field("name"));
+        categoryNameAgg.subAggregation(rtnAgg);
+
+        //NestedFilterBuilder bookAuthorNestedFilter = FilterBuilders.nestedFilter("bookCategories.books", FilterBuilders.termsFilter("bookCategories.books.bookAuthor", "bibicx"));
+        //TermsBuilder bookAuthorAgg = AggregationBuilders.terms("agg_bookCategories.books.bookAuthor").field("bookCategories.books.bookAuthor");
+        //AbstractAggregationBuilder secNestedAgg = AggregationBuilders.nested("nested_bookCategories.books.bookAuthor").path("bookCategories.books").subAggregation(bookAuthorAgg);
+
+        //categoryNameAgg.subAggregation(secNestedAgg);
+
+        //NestedFilterBuilder bookPublisherCodeNestedFilter = FilterBuilders.nestedFilter("bookCategories.books", FilterBuilders.termsFilter("bookCategories.books.bookPublisher.publisherCode", "PUB_03"));
+        //NestedFilterBuilder bookProviderNameNestedFilter = FilterBuilders.nestedFilter("bookCategories.books.bookPublisher.bookProvider", FilterBuilders.termsFilter("bookCategories.books.bookPublisher.bookProvider.providerName", "PVD_01"));
+
+        //FilterBuilder topFilter = FilterBuilders.boolFilter().must(categoryNameTerm).must(bookAuthorNestedFilter).must(bookPublisherCodeNestedFilter).must(bookProviderNameNestedFilter);
+
+        searchReq.addAggregation(topAgg);
+
+        System.out.println(searchReq);
+
+    }
 }