Skip to content

Commit ff82c67

Browse files
authored
Push down filters on nested fields as nested queries (#4825)
* lewSupport basic nested queries when applying filter on a nested filed Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> # Conflicts: # integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java # opensearch/src/main/java/org/opensearch/sql/opensearch/storage/scan/CalciteLogicalIndexScan.java * Test filter on both nested and root level fields Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Support nested queries for simple queries: range, term, terms, etc Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Add integration tests for filtering on nested Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Add a error case for accessing different levels of nested objects in scripts Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Add a test for accessing nested filter in filter in aggregation Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Chores: remove unnecessary comments Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Update plans Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Remove unused plans Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Use null instead of empty string as a default to nest path attribute Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 07629d4 commit ff82c67

20 files changed

Lines changed: 508 additions & 19 deletions

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ALIAS;
1010
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_BANK;
1111
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES;
12+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_CASCADED_NESTED;
13+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DEEP_NESTED;
1214
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_LOGS;
1315
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_NESTED_SIMPLE;
1416
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_OTEL_LOGS;
@@ -27,6 +29,7 @@
2729
import org.junit.Test;
2830
import org.opensearch.sql.ast.statement.ExplainMode;
2931
import org.opensearch.sql.common.setting.Settings.Key;
32+
import org.opensearch.sql.common.utils.StringUtils;
3033
import org.opensearch.sql.ppl.ExplainIT;
3134
import org.opensearch.sql.protocol.response.format.Format;
3235

@@ -47,6 +50,8 @@ public void init() throws Exception {
4750
loadIndex(Index.WORK_INFORMATION);
4851
loadIndex(Index.WEBLOG);
4952
loadIndex(Index.DATA_TYPE_ALIAS);
53+
loadIndex(Index.DEEP_NESTED);
54+
loadIndex(Index.CASCADED_NESTED);
5055
}
5156

5257
@Override
@@ -2368,4 +2373,68 @@ public void testExplainBWC() throws IOException {
23682373
explainQueryToStringBWC(query, format));
23692374
}
23702375
}
2376+
2377+
@Test
2378+
public void testFilterOnComputedNestedFields() throws IOException {
2379+
assertYamlEqualsIgnoreId(
2380+
loadExpectedPlan("filter_computed_nested.yaml"),
2381+
explainQueryYaml(
2382+
StringUtils.format(
2383+
"source=%s | eval proj_name_len=length(projects.name) | fields projects.name,"
2384+
+ " proj_name_len | where proj_name_len > 29",
2385+
TEST_INDEX_DEEP_NESTED)));
2386+
}
2387+
2388+
@Test
2389+
public void testFilterOnNestedAndRootFields() throws IOException {
2390+
assertYamlEqualsIgnoreId(
2391+
loadExpectedPlan("filter_root_and_nested.yaml"),
2392+
// city is not in a nested object
2393+
explainQueryYaml(
2394+
StringUtils.format(
2395+
"source=%s | where city.name = 'Seattle' and length(projects.name) > 29",
2396+
TEST_INDEX_DEEP_NESTED)));
2397+
}
2398+
2399+
@Test
2400+
public void testFilterOnNestedFields() throws IOException {
2401+
assertYamlEqualsIgnoreId(
2402+
loadExpectedPlan("filter_nested_term.yaml"),
2403+
// address is a nested object
2404+
explainQueryYaml(
2405+
StringUtils.format(
2406+
"source=%s | where address.city = 'New york city'", TEST_INDEX_NESTED_SIMPLE)));
2407+
2408+
assertYamlEqualsIgnoreId(
2409+
loadExpectedPlan("filter_nested_terms.yaml"),
2410+
explainQueryYaml(
2411+
StringUtils.format(
2412+
"source=%s | where address.city in ('Miami', 'san diego')",
2413+
TEST_INDEX_NESTED_SIMPLE)));
2414+
}
2415+
2416+
@Test
2417+
public void testFilterOnMultipleCascadedNestedFields() throws IOException {
2418+
// 1. Access two different hierarchies of nested fields, one at author.books.reviews, another at
2419+
// author.books
2420+
// 2. One is pushed as nested range query, another is pushed as nested filter query.
2421+
assertYamlEqualsIgnoreId(
2422+
loadExpectedPlan("filter_multiple_nested_cascaded_range.yaml"),
2423+
explainQueryYaml(
2424+
StringUtils.format(
2425+
"source=%s | where author.books.reviews.rating >=4 and author.books.reviews.rating"
2426+
+ " < 6 and author.books.title = 'The Shining'",
2427+
TEST_INDEX_CASCADED_NESTED)));
2428+
}
2429+
2430+
@Test
2431+
public void testAggFilterOnNestedFields() throws IOException {
2432+
enabledOnlyWhenPushdownIsEnabled();
2433+
assertYamlEqualsIgnoreId(
2434+
loadExpectedPlan("agg_filter_nested.yaml"),
2435+
explainQueryYaml(
2436+
StringUtils.format(
2437+
"source=%s | stats count(eval(author.name < 'K')) as george_and_jk",
2438+
TEST_INDEX_CASCADED_NESTED)));
2439+
}
23712440
}

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteWhereCommandIT.java

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,152 @@
55

66
package org.opensearch.sql.calcite.remote;
77

8+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_CASCADED_NESTED;
9+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DEEP_NESTED;
10+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_NESTED_SIMPLE;
11+
import static org.opensearch.sql.util.MatcherUtils.rows;
12+
import static org.opensearch.sql.util.MatcherUtils.schema;
13+
import static org.opensearch.sql.util.MatcherUtils.verifyDataRows;
14+
import static org.opensearch.sql.util.MatcherUtils.verifyErrorMessageContains;
15+
import static org.opensearch.sql.util.MatcherUtils.verifySchema;
16+
17+
import java.io.IOException;
18+
import java.util.List;
19+
import java.util.Map;
20+
import org.json.JSONObject;
21+
import org.junit.Test;
22+
import org.opensearch.sql.common.utils.StringUtils;
823
import org.opensearch.sql.ppl.WhereCommandIT;
924

1025
public class CalciteWhereCommandIT extends WhereCommandIT {
1126
@Override
1227
public void init() throws Exception {
1328
super.init();
1429
enableCalcite();
30+
loadIndex(Index.NESTED_SIMPLE);
31+
loadIndex(Index.DEEP_NESTED);
32+
loadIndex(Index.CASCADED_NESTED);
1533
}
1634

1735
@Override
1836
protected String getIncompatibleTypeErrMsg() {
1937
return "In expression types are incompatible: fields type LONG, values type [INTEGER, INTEGER,"
2038
+ " STRING]";
2139
}
40+
41+
@Test
42+
public void testFilterOnComputedNestedFields() throws IOException {
43+
JSONObject result =
44+
executeQuery(
45+
String.format(
46+
"source=%s | eval proj_name_len=length(projects.name) | fields projects.name,"
47+
+ " proj_name_len | where proj_name_len > 29",
48+
TEST_INDEX_DEEP_NESTED));
49+
verifySchema(result, schema("projects.name", "string"), schema("proj_name_len", "int"));
50+
verifyDataRows(result, rows("AWS Redshift Spectrum querying", 30));
51+
}
52+
53+
@Test
54+
public void testFilterOnNestedAndRootFields() throws IOException {
55+
JSONObject result =
56+
executeQuery(
57+
String.format(
58+
"source=%s | where city.name = 'Seattle' and length(projects.name) > 29 | fields"
59+
+ " city.name, projects.name",
60+
TEST_INDEX_DEEP_NESTED));
61+
verifySchema(result, schema("city.name", "string"), schema("projects.name", "string"));
62+
verifyDataRows(result, rows("Seattle", "AWS Redshift Spectrum querying"));
63+
}
64+
65+
@Test
66+
public void testFilterOnNestedFields() throws IOException {
67+
// address is a nested object
68+
JSONObject result1 =
69+
executeQuery(
70+
String.format(
71+
"source=%s | where address.city = 'New york city' | fields address.city",
72+
TEST_INDEX_NESTED_SIMPLE));
73+
verifySchema(result1, schema("address.city", "string"));
74+
verifyDataRows(result1, rows("New york city"));
75+
76+
JSONObject result2 =
77+
executeQuery(
78+
String.format(
79+
"source=%s | where address.city in ('Miami', 'san diego') | fields address.city",
80+
TEST_INDEX_NESTED_SIMPLE));
81+
verifyDataRows(result2, rows("Miami"), rows("san diego"));
82+
}
83+
84+
@Test
85+
public void testFilterOnMultipleCascadedNestedFields() throws IOException {
86+
// SQL's static type system does not allow returning list[int] in place of int
87+
enabledOnlyWhenPushdownIsEnabled();
88+
JSONObject result =
89+
executeQuery(
90+
String.format(
91+
"source=%s | where author.books.reviews.rating >=4 and author.books.reviews.rating"
92+
+ " < 6 and author.books.title = 'The Shining' | fields author.books",
93+
TEST_INDEX_CASCADED_NESTED));
94+
verifySchema(result, schema("author.books", "array"));
95+
verifyDataRows(
96+
result,
97+
rows(
98+
List.of(
99+
Map.of(
100+
"title",
101+
"The Shining",
102+
"reviews",
103+
List.of(
104+
Map.of(
105+
"review_date",
106+
"2022-09-03",
107+
"rating",
108+
3,
109+
"comment",
110+
"Brilliant but terrifying"),
111+
Map.of(
112+
"review_date",
113+
"2023-04-12",
114+
"rating",
115+
4,
116+
"comment",
117+
"Psychological horror at its best"),
118+
Map.of(
119+
"review_date",
120+
"2023-10-28",
121+
"rating",
122+
2,
123+
"comment",
124+
"Too slow in places"))))));
125+
}
126+
127+
@Test
128+
public void testScriptFilterOnDifferentNestedHierarchyShouldThrow() throws IOException {
129+
enabledOnlyWhenPushdownIsEnabled();
130+
Throwable t =
131+
assertThrows(
132+
Exception.class,
133+
() ->
134+
executeQuery(
135+
String.format(
136+
"source=%s | where author.books.reviews.rating + length(author.books.title)"
137+
+ " > 10",
138+
TEST_INDEX_CASCADED_NESTED)));
139+
verifyErrorMessageContains(
140+
t,
141+
"Accessing multiple nested fields under different hierarchies in script is not supported:"
142+
+ " [author.books.reviews, author.books]");
143+
}
144+
145+
@Test
146+
public void testAggFilterOnNestedFields() throws IOException {
147+
enabledOnlyWhenPushdownIsEnabled();
148+
JSONObject result =
149+
executeQuery(
150+
StringUtils.format(
151+
"source=%s | stats count(eval(author.name < 'K')) as george_and_jk",
152+
TEST_INDEX_CASCADED_NESTED));
153+
verifySchema(result, schema("george_and_jk", "bigint"));
154+
verifyDataRows(result, rows(2));
155+
}
22156
}

integ-test/src/test/java/org/opensearch/sql/legacy/SQLIntegTestCase.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,11 @@ public enum Index {
704704
"_doc",
705705
getDeepNestedIndexMapping(),
706706
"src/test/resources/deep_nested_index_data.json"),
707+
CASCADED_NESTED(
708+
TestsConstants.TEST_INDEX_CASCADED_NESTED,
709+
"_doc",
710+
getMappingFile("cascaded_nested_index_mapping.json"),
711+
"src/test/resources/cascaded_nested.json"),
707712
TELEMETRY(
708713
TestsConstants.TEST_INDEX_TELEMETRY,
709714
"_doc",

integ-test/src/test/java/org/opensearch/sql/legacy/TestsConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public class TestsConstants {
5454
public static final String TEST_INDEX_TIME_DATA = TEST_INDEX + "_time_data";
5555

5656
public static final String TEST_INDEX_DEEP_NESTED = TEST_INDEX + "_deep_nested";
57+
public static final String TEST_INDEX_CASCADED_NESTED = TEST_INDEX + "_cascaded_nested";
5758
public static final String TEST_INDEX_TELEMETRY = TEST_INDEX + "_telemetry";
5859
public static final String TEST_INDEX_STRINGS = TEST_INDEX + "_strings";
5960
public static final String TEST_INDEX_DATATYPE_NUMERIC = TEST_INDEX + "_datatypes_numeric";
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{"index": {"_id": "1"}}
2+
{"author": {"name": "J.K. Rowling", "books": [{"title": "Harry Potter and the Sorcerer's Stone", "reviews": [{"rating": 5, "comment": "Magical and enchanting!", "review_date": "2023-01-15"}, {"rating": 4, "comment": "Great for kids and adults", "review_date": "2023-06-22"}]}, {"title": "Harry Potter and the Chamber of Secrets", "reviews": [{"rating": 5, "comment": "Even better than the first", "review_date": "2023-02-10"}, {"rating": 4, "comment": "Darker tone emerging", "review_date": "2023-07-18"}]}]}}
3+
{"index": {"_id": "2"}}
4+
{"author": {"name": "George R.R. Martin", "books": [{"title": "A Game of Thrones", "reviews": [{"rating": 4, "comment": "Epic fantasy masterpiece", "review_date": "2022-11-05"}, {"rating": 3, "comment": "Too many characters to track", "review_date": "2023-03-20"}]}, {"title": "A Clash of Kings", "reviews": [{"rating": 2, "comment": "Incredible plot twists", "review_date": "2023-08-14"}]}]}}
5+
{"index": {"_id": "3"}}
6+
{"author": {"name": "Stephen King", "books": [{"title": "The Shining", "reviews": [{"rating": 3, "comment": "Brilliant but terrifying", "review_date": "2022-09-03"}, {"rating": 4, "comment": "Psychological horror at its best", "review_date": "2023-04-12"}, {"rating": 2, "comment": "Too slow in places", "review_date": "2023-10-28"}]}]}}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalAggregate(group=[{}], george_and_jk=[COUNT($0)])
5+
LogicalProject($f1=[CASE(<($7, 'K'), 1, null:NULL)])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_cascaded_nested]])
7+
physical: |
8+
EnumerableLimit(fetch=[10000])
9+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_cascaded_nested]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=RelSubset#,group={},george_and_jk=COUNT() FILTER $0)], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","aggregations":{"george_and_jk":{"filter":{"nested":{"query":{"range":{"author.name":{"from":null,"to":"K","include_lower":true,"include_upper":false,"boost":1.0}}},"path":"author","ignore_unmapped":false,"score_mode":"none","boost":1.0}},"aggregations":{"george_and_jk":{"value_count":{"field":"_index"}}}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalFilter(condition=[>($1, 29)])
5+
LogicalProject(projects.name=[$3], proj_name_len=[CHAR_LENGTH($3)])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_deep_nested]])
7+
physical: |
8+
EnumerableCalc(expr#0=[{inputs}], expr#1=[CHAR_LENGTH($t0)], proj#0..1=[{exprs}])
9+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_deep_nested]], PushDownContext=[[PROJECT->[projects.name], SCRIPT->>(CHAR_LENGTH($0), 29), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","query":{"nested":{"query":{"script":{"script":{"source":"{\"langType\":\"calcite\",\"script\":\"rO0ABXQCHHsKICAib3AiOiB7CiAgICAibmFtZSI6ICI8IiwKICAgICJraW5kIjogIkxFU1NfVEhBTiIsCiAgICAic3ludGF4IjogIkJJTkFSWSIKICB9LAogICJvcGVyYW5kcyI6IFsKICAgIHsKICAgICAgImR5bmFtaWNQYXJhbSI6IDAsCiAgICAgICJ0eXBlIjogewogICAgICAgICJ0eXBlIjogIkJJR0lOVCIsCiAgICAgICAgIm51bGxhYmxlIjogdHJ1ZQogICAgICB9CiAgICB9LAogICAgewogICAgICAib3AiOiB7CiAgICAgICAgIm5hbWUiOiAiQ0hBUl9MRU5HVEgiLAogICAgICAgICJraW5kIjogIkNIQVJfTEVOR1RIIiwKICAgICAgICAic3ludGF4IjogIkZVTkNUSU9OIgogICAgICB9LAogICAgICAib3BlcmFuZHMiOiBbCiAgICAgICAgewogICAgICAgICAgImR5bmFtaWNQYXJhbSI6IDEsCiAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICAgICAgICJwcmVjaXNpb24iOiAtMQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgXQogICAgfQogIF0KfQ==\"}","lang":"opensearch_compounded_script","params":{"utcTimestamp": 0,"SOURCES":[2,0],"DIGESTS":[29,"projects.name"]}},"boost":1.0}},"path":"projects","ignore_unmapped":false,"score_mode":"none","boost":1.0}},"_source":{"includes":["projects.name"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(author=[$0])
5+
LogicalFilter(condition=[AND(SEARCH($4, Sarg[[4..6)]), =($6, 'The Shining'))])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_cascaded_nested]])
7+
physical: |
8+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_cascaded_nested]], PushDownContext=[[PROJECT->[author, author.books.reviews.rating, author.books.title], FILTER->AND(SEARCH($1, Sarg[[4..6)]), =($2, 'The Shining')), PROJECT->[author], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","query":{"bool":{"must":[{"nested":{"query":{"range":{"author.books.reviews.rating":{"from":4.0,"to":6.0,"include_lower":true,"include_upper":false,"boost":1.0}}},"path":"author.books.reviews","ignore_unmapped":false,"score_mode":"none","boost":1.0}},{"nested":{"query":{"term":{"author.books.title":{"value":"The Shining","boost":1.0}}},"path":"author.books","ignore_unmapped":false,"score_mode":"none","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"_source":{"includes":["author"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(name=[$0], address=[$1], id=[$7], age=[$8])
5+
LogicalFilter(condition=[=($3, 'New york city')])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_nested_simple]])
7+
physical: |
8+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_nested_simple]], PushDownContext=[[PROJECT->[name, address, address.city, id, age], FILTER->=($2, 'New york city'), PROJECT->[name, address, id, age], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","query":{"nested":{"query":{"term":{"address.city.keyword":{"value":"New york city","boost":1.0}}},"path":"address","ignore_unmapped":false,"score_mode":"none","boost":1.0}},"_source":{"includes":["name","address","id","age"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(name=[$0], address=[$1], id=[$7], age=[$8])
5+
LogicalFilter(condition=[SEARCH($3, Sarg['Miami':VARCHAR, 'san diego':VARCHAR]:VARCHAR)])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_nested_simple]])
7+
physical: |
8+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_nested_simple]], PushDownContext=[[PROJECT->[name, address, address.city, id, age], FILTER->SEARCH($2, Sarg['Miami':VARCHAR, 'san diego':VARCHAR]:VARCHAR), PROJECT->[name, address, id, age], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","query":{"nested":{"query":{"terms":{"address.city.keyword":["Miami","san diego"],"boost":1.0}},"path":"address","ignore_unmapped":false,"score_mode":"none","boost":1.0}},"_source":{"includes":["name","address","id","age"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])

0 commit comments

Comments
 (0)