示例 - 索引和查询JSON文档
学习如何使用Redis查询引擎与JSON
此示例展示了如何为JSON数据创建搜索索引并针对该索引运行查询。
确保你已经安装了Redis Stack和Jedis
。
首先导入依赖项:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
连接到数据库:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
创建一些测试数据以添加到数据库中:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
创建一个索引。在这个例子中,只有带有键前缀 user:
的 JSON 文档会被索引。更多信息,请参阅 查询语法。
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
将三组用户数据作为JSON对象添加到数据库中。
如果你使用带有user:
前缀的键,那么Redis会在你添加时自动索引这些对象:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
你现在可以使用索引来搜索JSON对象。下面的
查询
搜索在任何字段中包含文本“Paul”并且
age
值在30到40之间的对象:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
指定查询选项以仅返回city
字段:
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
使用 聚合查询 来计算每个城市中的所有用户。
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;
import java.util.List;
public class HomeJsonExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
JSONObject user1 = new JSONObject()
.put("name", "Paul John")
.put("email", "paul.john@example.com")
.put("age", 42)
.put("city", "London");
JSONObject user2 = new JSONObject()
.put("name", "Eden Zamir")
.put("email", "eden.zamir@example.com")
.put("age", 29)
.put("city", "Tel Aviv");
JSONObject user3 = new JSONObject()
.put("name", "Paul Zamir")
.put("email", "paul.zamir@example.com")
.put("age", 35)
.put("city", "Tel Aviv");
SchemaField[] schema = {
TextField.of("$.name").as("name"),
TextField.of("$.city").as("city"),
NumericField.of("$.age").as("age")
};
String createResult = jedis.ftCreate("idx:users",
FTCreateParams.createParams()
.on(IndexDataType.JSON)
.addPrefix("user:"),
schema
);
System.out.println(createResult); // >>> OK
String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
SearchResult findPaulResult = jedis.ftSearch("idx:users",
"Paul @age:[30 40]"
);
System.out.println(findPaulResult.getTotalResults()); // >>> 1
List<Document> paulDocs = findPaulResult.getDocuments();
for (Document doc: paulDocs) {
System.out.println(doc.getId());
}
// >>> user:3
SearchResult citiesResult = jedis.ftSearch("idx:users",
"Paul",
FTSearchParams.searchParams()
.returnFields("city")
);
System.out.println(citiesResult.getTotalResults()); // >>> 2
for (Document doc: citiesResult.getDocuments()) {
System.out.println(doc.getId());
}
// >>> user:1
// >>> user:3
AggregationResult aggResult = jedis.ftAggregate("idx:users",
new AggregationBuilder("*")
.groupBy("@city", Reducers.count().as("count"))
);
System.out.println(aggResult.getTotalResults()); // >>> 2
for (Row cityRow: aggResult.getRows()) {
System.out.println(String.format(
"%s - %d",
cityRow.getString("city"), cityRow.getLong("count"))
);
}
// >>> London - 1
// >>> Tel Aviv - 2
jedis.close();
}
}
请参阅Redis查询引擎文档,了解所有查询功能的完整描述及示例。