C#读取RSS源,并利用Solr索引

  折磨我几天的问题今天终于解决了,分享一下近期solr使用的一些经验。

本来是用nutch在爬取页面,可是客户需要爬取RSS,而且可以识别那些页面是通过RSS源抓取出来的。nutch虽然自带解析RSS的插件,但是有些RSS解析不了,也不好控制,更重要的抓取后和普通页面就没什么太大的区别了,不能识别不能判断是由哪个rss源抓取出来的。因为上面原因,所以就自己用C#写了一个配合Solr抓取RSS的工程。

一切实现好后,客户非常满意,我也觉得做的还不错,可是过了一段时间后发现nutch在solrdedup时失败了,导致nutch不能使用。下面就把rss实现的原理,和问题的产生进行介绍,解决solr和nutch这些问题不是因为非常难理解,主要是这类问题在网上很难找到。由于公司没有外网和拷贝权限,所有的一切只能凭我的记忆写出来了。

 RSS+Solr的实现是利用webrequest读取到rss源的xml格式的内容,直接里面post方式为solr建立索引。为了达到客户的要求,我在solr的schame里面添加了rss和isrss字段,rss为rss源的url地址,isrss固定为ture。由于nutch没有这2个字段,所以我们查询rss只需 输入 isrss:"true"就可以过滤掉不是rss出来的页面。

实现过程中主要要注意下面几点

1.rss源并不是后缀为xml的文件,有些就是普通页面response出来的,而且有些是需要登录权限的

2.rss目前主要有2种格式,普遍的xml结构为rss/channel/item ,另外一种就是我们博客园rss的结构feed/entry。

里面的标签是固定的,可以通过不同的标签找到solr里面filed需要的值

3.id,digest,tstamp三个栏位是必须要的。

上面提到nutch 运行到solrdedup时就报错,开始我以为是solr里面新加的2个字段,尝试为nutch也新增2个字段,而且还利用nutch的静态栏位插件和额外栏位插件,但是没有用,最后我发现把solr的数据清除后居然nutch可以正常运行,我在google里面也查了很多,但是基本没什么帮助,还以为是solr cache的原因。今天刚好有点空,所以我找到了nutch的报错文件solrdeleteduplicates.java,研究发现里面nutch去除重复是从solr直接取了id,digest,tstamp字段,没有判断是否为空就直接使用了。

但是我写的程序里面digest和tsamp是没有添加的,果然添加完这2个栏位,把所有没有这2个栏位的数据全部补完整,nutch又可以正常运行了

4.digest是网页的32位哈希值,用来nutch去除重复时进行比较差异

5.solr是可以直接通过请求url对内容进行新增,修改,删除,其中修改的格式与新增一样

 主要核心为:xx.xx.xx.xx/solr/update?stream.body=<add><doc><field name="xx">xx</filed></doc><add>&stream.contentType=text/xm;charset=utf-8&commit=true

如果内容有ur格式和html格式需要对其进行转码

6,solr的时间是GMT格式的时间,所以不要弄错,而且rss里面的GMT格式有些是不对的,我就遇到了很多,星期不对都会引起solr index失败。

现在信息都还是比较齐全,搜索还是比较方便的,但是还是有很多问题需要解决,主要是js生成页面不能读取,还有页面上信息的过滤。获取文章的主要内容,过滤导航等其他信息还是比较难的,目前我查到的别人是根据统计规律在进行过滤,比如导航条中间很多是用|分开的,内容里面的空格间隔等。每个站点的html布局风格不一样,标签这些很难统一,百度,谷歌也不知道是怎么实现的,或者它们其实也没有实现。

nutch还是比较强大的,但是总觉得不好维护和修改,上次编译一下源代码都费了很长时间,solr的查询也是比较高效的。 可能计划写一个.net版本的爬虫和搜索,但是只是在计划中,因为涉及到的问题太多了...

时间: 2024-12-28 21:26:18

C#读取RSS源,并利用Solr索引的相关文章

利用SOLR搭建企业搜索平台 之——Solr索引基本操作

来源:http://blog.csdn.net/zx13525079024/article/details/25367239 我们来看下通过界面来操作SOLR,包括SOLR索引的添加,查询等基本操作. 所有的基本操作都通过如下地址来完成 http://localhost:8040/Solr/#/collection1/documents 1.添加和修改 点击界面做出的documents链接,索引的添加修改都是在这个界面完成的. Request-Handler 表示操作方式 Document Ty

Solr初始化源码分析-Solr初始化与启动

用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机制弄熟,才能把这个项目做好.今天分享的就是:Solr是如何启动并且初始化的.大家知道,部署solr时,分两部分:一.solr的配置文件.二.solr相关的程序.插件.依赖lucene相关的jar包.日志方面的jar.因此,在研究solr也可以顺着这个思路:加载配置文件.初始化各个core.初始化各个

使用Solr索引MySQL数据

环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\solr-4.10.3\example 4.Execute the server by “java -jar startup.jar”Solr会自动运行在自带的Jetty上 5.访问http://localhost:8983/solr/#/ 创建MySQL数据 DataBase Name: mybat

利用Solr服务建立的站内搜索雏形---solr1

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将“*:*”改写为“title:安徽”,则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到那么炫,只要整到在solr的管

利用Solr服务建立的界面化站内搜索---solr2

继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大…… 简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧. 上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法.本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根

使用solrj操作solr索引库

(solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有那么麻烦,solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库. 一.认识solrj solrj是solr的java客户端,用于访问solr索引库.它提供了添加.删除.查询.优化等功能. 二.下载 百度.google以下solrj下载,你会发现根本就没有,那么我们该到哪儿

利用SOLR搭建企业搜索平台 之——MultiCore

Solr Multicore 是 solr 1.3 的新特性.其目是一个solr实例,可以有多个搜索应用. 下面着手来将solr给出的一个example跑出来.这篇文章是基于<利用SOLR搭建企业搜索平台 之——运行solr>,有不明白的请参见http://lianj-lee.javaeye.com/blog/424383 1. 找到solr下载包中的example文件夹,在它的下面有个multicore文件夹,将这个文件夹下面的所有东西copy到 c:/solr-tomcat/solr下面.

利用SQL索引提高查询速度

1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引. 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引. 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引.比如在雇员表的“性别”列上只有“男”与“女”两个不同值

利用虚拟索引(Virtual Index)优化数据库的案例分析

当我们在对生产库做优化的时候,主要就是对SQL语句的优化,包括语句的等价改写等,但其中很大一部分情况,又与索引有关.如果能合理利用合适的索引,可以使原本走全表扫描产生的逻辑读大大降低,提高数据库的性能.由于Oracle数据库中的索引本身就要占用磁盘空间,维护索引需要一定的开销,如何才能知道创建某个索引,会给数据带来性能的提升,而又不至于判断失误,创建了一个不恰当的索引,最后又不得不删除呢?这种情况下,我们可以利用Oralce提供的虚拟索引,即nosegment索引,它并不占用磁盘资源,只是在数据