RediSearch vs Elasticsearch: Cheap Setup, Performance Benchmarks, Java Guide
RediSearch, a low‑memory Redis module, offers comparable full‑text search capabilities to Elasticsearch, with faster indexing and query performance on modest hardware; this article explains its features, compares benchmarks, shows Docker installation, and provides Java/Jedis code examples for creating, querying, and managing indexes.
RediSearch Overview
RediSearch is a Redis module that adds full‑text search, secondary indexing, and query capabilities to Redis. It uses compressed inverted indexes, resulting in low memory consumption and fast index construction. The latest version supports text tokenization, aggregation, stop‑words, synonyms, spell checking, sorting, tag queries, vector similarity, and Chinese tokenization.
Comparison with Elasticsearch
Hardware Requirements
Data Source
Configuration
Index Build Test
In the official index‑build benchmark, RediSearch completed the task in 221 seconds, beating Elasticsearch's 349 seconds—a 58% improvement.
Query Performance Test
After loading data into the index, a load‑generator with 32 clients issued two‑term search queries. RediSearch achieved 12.5K ops/sec, while Elasticsearch reached only 3.1K ops/sec—approximately four times faster. Latency was also slightly better (8 ms vs 10 ms).
RediSearch 2.0 further improves throughput and latency by about 2.4× compared with version 1.6.
Installation
For RediSearch 2.0+, the recommended deployment is the redis-stack-server Docker image.
docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latestSet a password if needed:
// Set login password
docker run -e REDIS_ARGS="--requirepass redis-stack" redis/redis-stack:latestVerify the module is loaded via redis-cli:
redis-cli -h localhost
> MODULE list
...
1) "name"
2) "search"
3) "ver"
4) "20809"
...Index Operations
Create Index (FT.CREATE)
> FT.CREATE idx:goods ON hash PREFIX 1 "goods:" LANGUAGE chinese SCHEMA goodsName TEXT SORTABLE
"OK"FT.CREATE – creates the index.
idx:goods – index name.
ON hash – indexes hash‑type data.
PREFIX 1 "goods:" – target keys start with goods:.
LANGUAGE chinese – enables Chinese tokenization.
SCHEMA goodsName TEXT SORTABLE – defines a searchable, sortable field.
Add source data:
hset goods:1001 goodsName 小米手机
hset goods:1002 goodsName 华为手机Search Index (FT.SEARCH)
> FT.SEARCH idx:goods1 "手机"
1) "2"
2) "goods:1001"
3) 1) "goodsName"
2) "\xe5\xb0\x8f\xe7\xb1\xb3\xe6\x89\x8b\xe6\x9c\xba"
4) "goods:1002"
5) 1) "goodsName"
2) "\xe5\x8d\x8e\xe4\xb8\xba\xe6\x89\x8b\xe6\x9c\xba"Get Index Info (FT.INFO)
> FT.INFO idx:goods
1) "index_name"
2) "idx:goods1"
3) "index_options"
4) (empty list or set)
5) "index_definition"
6) 1) "key_type"
2) "HASH"
3) "prefixes"
4) 1) "goods:"
...Delete Index (FT.DROPINDEX)
> FT.DROPINDEX idx:goods1
"OK"To remove indexed data, delete the associated hash keys with DEL.
Java Integration with Jedis
Use Jedis 4.0+ which includes RediSearch support.
Create Jedis Client Bean
@Bean
public UnifiedJedis unifiedJedis(GenericObjectPoolConfig jedisPoolConfig) {
UnifiedJedis client;
if (StringUtils.isNotEmpty(password)) {
client = new JedisPooled(jedisPoolConfig, host, port, timeout, password, database);
} else {
client = new JedisPooled(jedisPoolConfig, host, port, timeout, null, database);
}
return client;
}Create Index in Java
Schema schema = new Schema()
.addSortableTextField("goodsName", 1.0)
.addSortableTagField("tag", "|");
IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.HASH)
.setPrefixes("idx:goods")
.setLanguage("chinese");
client.ftCreate(idxName, IndexOptions.defaultOptions().setDefinition(rule), schema);Add Documents
public boolean addGoodsIndex(String keyPrefix, Goods goods) {
Map<String, String> hash = MyBeanUtil.toMap(goods);
hash.put("_language", "chinese");
client.hset("idx:goods" + goods.getGoodsId(), hash);
return true;
}Search with Chinese Tokenization
public SearchResult search(String goodsIdxName, SearchObjVO searchObjVO, Page<SearchPageGoodsVO> page) {
String keyword = searchObjVO.getKeyword();
String queryKey = String.format("@goodsName:(%s)", keyword);
Query q = new Query(queryKey);
if (StringUtils.isNotBlank(searchObjVO.getSidx())) {
q.setSortBy(searchObjVO.getSidx(), Constants.SORT_ASC.equals(searchObjVO.getOrder()));
}
q.setLanguage("chinese");
q.limit((int) page.offset(), (int) page.getSize());
return client.ftSearch(goodsIdxName, q);
}Conclusion
RediSearch provides a lightweight, fast full‑text search solution with low memory overhead and easy Docker deployment, making it attractive for small‑to‑medium projects. However, enterprise‑grade Redis clustering support is currently limited to the commercial Redis Enterprise edition, so large‑scale production use should be evaluated carefully.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
macrozheng
Dedicated to Java tech sharing and dissecting top open-source projects. Topics include Spring Boot, Spring Cloud, Docker, Kubernetes and more. Author’s GitHub project “mall” has 50K+ stars.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
