搜索引擎系统

来源:互联网 发布:淘宝二手书可靠吗 编辑:程序博客网 时间: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文件的内容重建,需要大概几分钟的时间。将来要研究一下怎么增量更新。

0 0
原创粉丝点击