JRediSearch
A Java Client Library for RediSearch
Deprecation notice
As of jedis 4.0.0 this library is deprecated. It's features have been merged into jedis. Please either install it from maven or the repo.
Overview
This project contains a Java library abstracting the API of the RediSearch Redis module, that implements a powerful in-memory Secondary Index, Query Engine and Full-Text Search engine inside Redis.
Installing
JRediSearch is available using the maven central snapshot repository and via official releases.
Official Releases
<dependencies>
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jredisearch</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
Snapshots
<repositories>
<repository>
<id>snapshots-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
and
<dependencies>
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jredisearch</artifactId>
<version>2.1.0-SNAPSHOT</version>
</dependency>
</dependencies>
Usage example
Initializing the client with JedisPool:
import io.redisearch.client.Client;
import io.redisearch.Document;
import io.redisearch.SearchResult;
import io.redisearch.Query;
import io.redisearch.Schema;
...
Client client = new Client("testung", "localhost", 6379);
Initializing the client with JedisSentinelPool:
import io.redisearch.client.Client;
import io.redisearch.Document;
import io.redisearch.SearchResult;
import io.redisearch.Query;
import io.redisearch.Schema;
...
private static final String MASTER_NAME = "mymaster";
private static final Set<String> sentinels;
static {
sentinels = new HashSet();
sentinels.add("localhost:7000");
sentinels.add("localhost:7001");
sentinels.add("localhost:7002");
}
...
Client client = new Client("testung", MASTER_NAME, sentinels);
Defining a schema for an index and creating it:
Schema sc = new Schema()
.addTextField("title", 5.0)
.addTextField("body", 1.0)
.addNumericField("price");
// IndexDefinition requires RediSearch 2.0+
IndexDefinition def = new IndexDefinition()
.setPrefixes(new String[] {"item:", "product:"})
.setFilter("@price>100");
client.createIndex(sc, Client.IndexOptions.defaultOptions().setDefinition(def));
Adding documents to the index:
Map<String, Object> fields = new HashMap<>();
fields.put("title", "hello world");
fields.put("state", "NY");
fields.put("body", "lorem ipsum");
fields.put("price", 1337);
// RediSearch 2.0+ supports working with Redis Hash commands
try(Jedis conn = client.connection()){
conn.hset("item", fields);
}
// Prior to RediSearch 2.0+ the addDocument has to be called
client.addDocument("item", fields);
Searching the index:
// Creating a complex query
Query q = new Query("hello world")
.addFilter(new Query.NumericFilter("price", 0, 1000))
.limit(0,5);
// actual search
SearchResult res = client.search(q);
// aggregation query
AggregationBuilder r = new AggregationBuilder("hello")
.apply("@price/1000", "k")
.groupBy("@state", Reducers.avg("@k").as("avgprice"))
.filter("@avgprice>=2")
.sortBy(10, SortedField.asc("@state"));
AggregationResult res = client.aggregate(r);
Also supported:
- Geo filtering
- Exact matching
- Union matching
- Stemming in 17 languages
- Deleting and updating documents on the fly
- And much more... See https://oss.redislabs.com/redisearch/ for more details.