搜索引擎系统
来源:互联网 发布:淘宝二手书可靠吗 编辑:程序博客网 时间:2024/05/16 06:24
1. 为什么要使用搜索引擎
在我们网站页面最上面的搜索框,目前是使用SQL数据库的模糊查询语句 ( like '%<被搜索的字符串>%') 实现的。这样做的问题是,只能精确匹配用户的输入的字符串。比如我们输入"夏季皮炎治疗方法",搜索不到任何信息,因为数据库里没有包含这个字符串的文章。但是如果我们在百度里用同样的字符串搜索,就可以搜索到相关的页面。
我们如果想要实现类似的效果,第一步要做分词,把"夏季皮炎治疗方法"分成4个词,分别是"夏季", "皮炎", "治疗", "方法",然后分别去检索这四个词。第二步,要使用全文检索系统代替数据库的模糊查询。因为数据库的模糊查询语句 like,是最慢的sql语句,当我们数据库里文章很多时,检索速度是不能接受的。
目前几乎所有的门户网站都支持全文检索。一种方法是使用google, baidu等第三方服务,这种方法和第三方程序绑定的紧,另外会有一定费用,不推荐。另外一种方法就是搭建自己的搜索引擎系统。solr就是一个开源的搜索引擎系统,搭建和使用起来非常方便。目前被广泛应用。
2. 搜索引擎系统solr的搭建
solr的安装配置比较复杂,我这里记录的是我安装solr的步骤,如果大家在安装的时候遇到什么问题,可以去网上搜索解决方法。
安装solr
solr安全性配置
solr配置多核
安装solr中文分词系统
配置dataimportehandler
3. 在我们的网站中使用solr
我在我们的阿里云服务器上配置好了solr( http://115.28.40.100:8080/solr )。想要在我们的网站中使用solr,必须把我们的数据导入到solr中。solr支持多种数据导入方式,可以通过solr web service接口,可以通过csv文件导入,也可以配置solr让它主动去数据库里抓取。我建议编程序使用solr web service接口,这样配置简单,过程可控。具体步骤。
a) 定义索引的schema
和数据库系统一样,搜索引擎里的数据也要遵循一定的schema。假设我们的数据schema是这样的:
ID: id 唯一标识一篇文章, 可以用uuid
类型: articleType 可以是: 文献,新闻,试题,病例等等
文章id: articleId 数据库里的id
作者: author
标题: title
摘要: summary
内容: content
录入时间: addDate
b) 把索引的schema写到solr的配置里:
用文件 http://pan.baidu.com/s/1moril#dir/path=%2F%E5%BC%80%E5%8F%91%2F%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E 里的schema.xml的内容替换掉 /opt/solr-tomcat/solr/mediskin/conf/schema.xml文件。重启tomcat,检查/var/log/solr/solr.log,看里面是否有错误。
c) 编写程序访问solr web service接口, 倒入数据:
我选择用java程序连接solr web service接口。solr提供java开发库,程序编写非常容易。代码我放在 http://pan.baidu.com/s/1moril#dir/path=%2F%E5%BC%80%E5%8F%91%2F%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E 上了。
d) 如何把搜索引擎集成到我们的网站里:
solr的query页面提供了很好的例子,通过在不同的字段里设置查询条件,我们可以灵活地使用搜索引擎。 比如:
q: 是要被搜索的字符串,和google, baidu一样,如果用引号括起来,表示精确匹配
fq: 是索引字段的权重分配,下面有讲到。fq同样可以用于对搜索结果的过滤,比如solr库里有各种数据,现在我们只想搜索文献类,就可以加一条 articleType:文献。可以同时设置多个fq。
start, rows: 是返回结果从那条数据开始,共显示多少条,方便分页查找
fl: 是要返回的子段,比如我们的数据都在数据库里,可能只返回 articleId 就可以了
wt: 指定返回的格式,是json,还是xml
这样网站程序需要的就是,作为客户端,发起这样一个查询: http://115.28.40.100:8080/solr/mediskin/select?q=%E9%98%BF%E5%88%A9%E7%BB%B4&fq=title^10.0+author^10.0+magzine^5.0+number^5.0+summary^3.0+content^3.0+&fq=articleType%3A%E6%96%87%E7%8C%AE&fl=*%2Cscore&wt=json&indent=true。然后读取返回结果,根据返回的Id从数据库里读出文献显示出来就可以了。需要用ajax来实现。
4. 待解决的问题
-- 搜索结果怎样按相关度排序:
为了使搜索结果符合常规的思维,需要给title标题设置比summary和content更高的权重,要看一下怎么能做到。在fq里可以设置各索引字段的权重,比如:“title^10.0 author^10.0 magzine^5.0 number^5.0 summary^3.0 content^3.0”,这样设置出来title匹配比内容匹配更容易获得高分。
-- 搜索结果怎样只返回部分列:
查询的时候,在fl里设置需要的子段。默认是*,代表所有。我们的情况,fl可以设置成id,articleType,articleId,score。url像这样:http://115.28.40.100:8080/solr/mediskin/select?q=%E5%84%BF%E7%AB%A5%E7%96%B1%E7%96%B9&rows=10&fl=id%2CarticleType%2CarticleId%2Cscore&wt=json&indent=true
-- 如何检索pdf文件里的内容:
-- 如何处理日期格式的数据:
-- 关键字匹配到后如何高亮显示:
-- 怎样增量更新索引:
目前我的程序是先把索引库清空,然后根据csv文件的内容重建,需要大概几分钟的时间。将来要研究一下怎么增量更新。
- 搜索引擎系统
- 搜索引擎系统
- 搜索引擎的系统架构
- 搜索引擎技术:系统架构
- 20款开源式搜索引擎系统
- 20款开源搜索引擎系统
- 20款开源搜索引擎系统
- 20款开源搜索引擎系统
- 搜索引擎4大系统
- Nutch搜索引擎系统架构
- 搜索引擎索引系统总结
- 搜索引擎查询系统总结
- 搜索引擎抓取系统概述
- 20款开源搜索引擎系统
- 大搜索引擎系统架构
- 推荐系统 vs 搜索引擎
- 《走进搜索引擎》-----Ch2---搜索引擎的下载系统
- solrcloud(solr4)搜索引擎系统架构
- C++基础之类型转换
- hdu 1879 继续畅通工程
- C/C++ include ""与<>的区别
- 并查集(模板)
- POJ 2570 Fiber Network
- 搜索引擎系统
- 7-3. 数素数 (20)
- KMP(模板)
- K3 数据库常用表
- 地图定位
- IOS笔记Json解析
- performSelector调度一个方法在以后某个时间执行
- uva 375(数学)
- ios内存分配