RediSearch 在项目中的使用

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的全文搜索引擎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值