利用Redis队列进行循环写入搜索索引

 1   public static void GetNewsList()
 2         {
 3
 4             while (true)
 5             {
 6                 using (var client = RedisManager.ClientManager.GetClient())
 7                 {
 8                     GoWrite(client);
 9                 }
10                 Thread.Sleep(60000);
11             }
12         }

循环调用写

 1     /// <summary>
 2         ///     开始写
 3         /// </summary>
 4         /// <param name="writer"></param>
 5         /// <param name="client"></param>
 6         private static void GoWrite(ServiceStack.Redis.IRedisClient client)
 7         {
 8             FSDirectory directory = null;
 9             IndexWriter writer = null;
10
11             try
12             {
13                 string indexPath = "d:/index";//注意和磁盘上文件夹的大小写一致,否则会报错
14
15                 directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
16
17                 //判断文件夹是否存在
18                 bool IsExis = IndexReader.IndexExists(directory);
19
20                 if (IsExis)
21                 {
22                     //如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
23                     if (IndexWriter.IsLocked(directory))
24                     {
25                         IndexWriter.Unlock(directory);
26                     }
27                 }
28
29                 writer = new IndexWriter(directory, new PanGuAnalyzer(), !IsExis, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
30
31                 while (true)
32                 {
33                     //NID, NTitle, NTxt, NTime, NTID
34                     string json = client.DequeueItemFromList("NewsIndex");
35
36                     //判断是否为NULL
37                     if (json == null)
38                     {
39                         //休息1秒退出
40                         Thread.Sleep(1000);
41                         return;
42                     }
43                     else
44                     {
45                         JavaScriptSerializer jss = new JavaScriptSerializer();
46                         Dictionary<string, object> dict = (Dictionary<string, object>)jss.DeserializeObject(json);
47
48                         //实例化News
49                         News news = new News();
50                         news.NTitle = dict["NTitle"].ToString();
51                         news.NTxt = dict["NTxt"].ToString();
52                         news.NTime = dict["NTime"].ToString();
53                         news.NID = Convert.ToInt64(dict["NID"]);
54                         news.NTID = Convert.ToInt32(dict["NTID"]);
55
56                         //写入索引库
57                         WriteIndex(news, writer);
58                     }
59                 }
60             }
61             finally
62             {
63                 //关闭IndexWriter
64                 if (writer != null)
65                 {
66                     writer.Close();
67                 }
68
69                 //关闭FSDirectory
70                 if (directory != null)
71                 {
72                     directory.Close();
73                 }
74             }
75         }

 1    /// <summary>
 2         ///     写入索引库
 3         /// </summary>
 4         /// <param name="news"></param>
 5         private static void WriteIndex(News news, IndexWriter writer)
 6         {
 7
 8             //写入数据
 9             Document document = new Document();
10
11             //删除相同的数据
12             writer.DeleteDocuments(new Term("NID", news.NID.ToString()));
13             //删除过时文件,需要将判断的字段设置为Field.Index.ANALYZED
14             writer.Optimize();
15
16             document.Add(new Field("NTitle", news.NTitle, Field.Store.YES, Field.Index.NOT_ANALYZED));
17             document.Add(new Field("NTxt", news.NTxt, Field.Store.YES, Field.Index.NOT_ANALYZED));
18             document.Add(new Field("NID", news.NID.ToString(), Field.Store.YES, Field.Index.ANALYZED));
19             document.Add(new Field("NTID", news.NTID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
20             document.Add(new Field("NTime", news.NTime.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
21             document.Add(new Field("ALL", news.NTitle + news.NTime + news.NTxt, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
22
23
24             //执行写入
25             writer.AddDocument(document);
26             Console.WriteLine("索引完毕");
27         }    

写入索引库

时间: 2024-08-11 07:35:25

利用Redis队列进行循环写入搜索索引的相关文章

利用redis完成自动补全搜索功能(二)

前面介绍了自动完成的大致思路,现在把搜索次数的功能也结合上去.我采用的是hash表来做的,当然也可以在生成分词的时候,另外一个有序集合来维护排序, 然后2个有序集合取交集即可.这里介绍hash的方式来实现. 产生分词 dist.php <?php require './redis.php'; //分词 $words = ['花讯','nba','nba直播','nba赛事','nba季后赛','nba录像','花讯品牌','花讯女装','花','n']; //利用管道 Cache::getIns

Java利用Redis实现消息队列

应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成java对象; 主要是用到了ByteArrayOutputStream和ByteArrayInputStream; 注意:每个需要序列化的对象都要实现Serializable接口; 其代码如下: 1 package Utils; 2 import java.io.*; 3 /** 4 * Created

利用redis List队列简单实现秒杀 PHP代码实现

利用redis List队列简单实现秒杀 PHP代码实现 2018年05月28日 11:37:46 m_nanle_xiaobudiu 阅读数 35674更多 分类专栏: Redis 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/80479666 一 生产者producer部分 ---------------------

第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

新建一个Java Project :LunceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene-analyzers-3.1.0.jar    (分词器) 3) lucene-highlighter-3.1.0.jar    (高亮器) 4) lucene-memory-3.1.0.jar       (高亮器) 新建实体类:Article, 属性:id,title,content; gett

PHP电商订单自动确认收货redis队列

一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态. 二.思路 最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update.最理想情况下,如果每分钟都有需要update的订单,这种方式也还行.奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟.那么,

(3)redis队列功能

Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpush Lindex获取一个元素,通过其索引列表 Linsert在列表中的另一个元素之前或之后插入一个元素 Llen获得队列(List)的长度 Lpop从队列的左边出队一个元素 Lpush从队列的左边入队一个或多个元素 Lpushx当队列存在时,从队到左边入队一个元素 Lrange从列表中获取指定返回的

转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异参考文章] 问题二:批量入库就需要有高并发的消息队列,决定

c#之Redis队列在邮件提醒中的应用

场景 有这样一个场景,一个邮件提醒的windows服务,获取所有开启邮件提醒的用户,循环获取这些用户的邮件,发送一条服务号消息.但问题来了,用户比较少的情况下,轮询一遍时间还能忍受,如果用户多了,那用户名称排序靠后的人,收到邮件提醒的消息,延迟时间就非常长了. 准备 c#之Redis实践list,hashtable c#之Redis队列 方案 1.生产者线程一获取所有开启邮件提醒的用户. 2.根据配置来决定使用多少个队列,以及每个队列的容量. 3.线程一,获取未满的队列,将当前用户入队.如果所有

基于lucene的案例开发:搜索索引

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42884921 此事例中的索引数据来自于上一篇博客创建的索引,索引中包含两篇文档,每一篇文档中有两个域 name . content . 索引搜索demo 还是老样子在介绍之前先看一个简单索引搜索 demo程序. /** *@Description: 索引检索demo */ package com.lulei.lucene.study; import java.io.File;