1、在java中的使用
1.1 环境搭建
1.1.1 引入依赖
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jredisearch</artifactId>
<version>2.0.0</version>
</dependency>
1.2 代码及输出
public static void main(String[] args) {
Client client = new Client("student", "123.232.112.84", 6399);
// 定义一个索引模式
Schema schema = new Schema().addTextField("title", 5.0).addTextField("body", 1.0).addNumericField("star");
// 先清除索引
client.dropIndex();
// 创建索引
client.createIndex(schema, Client.IndexOptions.Default());
// 向索引中添加文档
Map<String, Object> fields1 = createDocument("任何视频", "新文档中不存在的内容将被保留。两者中存在的字段都会被覆盖", 1000);
Map<String, Object> fields2 = createDocument("任何通信", "新文档中不存在的内容将丢失", 500);
client.addDocument("doc1", fields1);
client.addDocument("doc2", fields2);
Query query = new Query("任何视频").addFilter(new Query.NumericFilter("star", 0, 1500)).setWithScores().limit(0, 10);
SearchResult result = client.search(query);
result.docs.stream().forEach(System.out::println);
}
private static Map<String, Object> createDocument(String title, String body, Integer price){
Map<String, Object> fields = new HashMap<String, Object>();
fields.put("title", title);
fields.put("body", body);
fields.put("star", price);
return fields;
}
成功输出
{"id":"doc1","score":2.200000047683716,"properties":{"star":"1000","title":"任何视频","body":"新文档中不存在的内容将被保留。两者中存在的字段都会被覆盖"}}
1.3 存在的问题
通过上面的程序貌似很正常其实如果你把
Query query = new Query("任何视频").addFilter(new Query.NumericFilter("star", 0, 1500)).setWithScores().limit(0, 10);
替换成
Query query = new Query("视频").addFilter(new Query.NumericFilter("star", 0, 1500)).setWithScores().limit(0, 10);
竟然没有任何输出,也就分词系统没有其作用。
1.4 解决
通过源码追踪发现没有传入 language “chinese”
改一下代码
public static void main(String[] args) {
Client client = new Client("student", "123.232.112.84", 6399);
// 定义一个索引模式
Schema schema = new Schema().addTextField("title", 5.0).addTextField("body", 1.0).addNumericField("star");
// 先清除索引
client.dropIndex();
// 创建索引
client.createIndex(schema, Client.IndexOptions.Default());
// 向索引中添加文档
Map<String, Object> fields1 = createDocument("任何视频", "新文档中不存在的内容将被保留。两者中存在的字段都会被覆盖", 1000);
Map<String, Object> fields2 = createDocument("任何通信", "新文档中不存在的内容将丢失", 500);
// client.addDocument("doc1", fields1);
// client.addDocument("doc2", fields2);
Document doc1 = new Document("doc1", fields1, 1.0, null);
Document doc2 = new Document("doc2", fields2, 1.0, null);
AddOptions options = new AddOptions().setNosave(false);
options.setLanguage("chinese");
client.addDocument(doc1, options);
client.addDocument(doc2, options);
Query query = new Query("内容").addFilter(new Query.NumericFilter("star", 0, 1500)).setWithScores().limit(0, 10);
SearchResult result = client.search(query);
result.docs.stream().forEach(System.out::println);
}
private static Map<String, Object> createDocument(String title, String body, Integer price){
Map<String, Object> fields = new HashMap<String, Object>();
fields.put("title", title);
fields.put("body", body);
fields.put("star", price);
return fields;
}
输出:
{"id":"doc1","score":0.4000000059604645,"properties":{"star":"1000","title":"任何视频","body":"新文档中不存在的内容将被保留。两者中存在的字段都会被覆盖"}}
{"id":"doc2","score":0.4000000059604645,"properties":{"star":"500","title":"任何通信","body":"新文档中不存在的内容将丢失"}}
2、在python中的使用
2.1 环境搭建
2.1.1 引入依赖
pip install redisearch
2.1.2 查看依赖树
redisearch==2.1.1
- hiredis [required: >=2.0.0,<3.0.0, installed: 2.0.0]
- redis [required: ==3.5.3, installed: 3.5.3]
- rejson [required: >=0.5.4,<0.6.0, installed: 0.5.6]
- redis [required: ==3.5.3, installed: 3.5.3]
- six [required: >=1.16.0,<2.0.0, installed: 1.16.0]
- six [required: >=1.16.0,<2.0.0, installed: 1.16.0]
2.2 代码及输出
from redisearch import Client, TextField
if __name__ == '__main__':
client = Client("student", host="123.232.112.84", port="6399")
client.create_index((TextField("name"), TextField("phone"), TextField("jtzz")))
client.add_document("xiaoxiao", fields ={"name":"小小", "phone":"1232323232", "jtzz":"“检索”,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene 等方案,但是elasticsearch对运行时内存有着最低限额,其运行时大小推荐 2G 以上的内存空间,并且需要额外的磁盘空间做持久化存储。"}, language="chinese")
res = client.search("检索")
print(res.docs[0].title)
pass
这里我们同样要指定语言,否则无法触发分词。
关于基本使用请参考RediSearch一个媲美es的全文搜索引擎