搜索引擎系统

2019-03-27 01:06|来源: 网路

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文件的内容重建,需要大概几分钟的时间。将来要研究一下怎么增量更新。


转自:http://www.cnblogs.com/momomisha/articles/3586338

相关问答

更多
  • if ($http_user_agent ~* (baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)){ return 503; } //大概意思就是http_user_agent中,含有列出的字符就返回503。例子中是常见的搜索引擎,如百度谷歌等,看你具体情况增删,用 | 分隔。
  • “西林街”、“盘搜一下”这两个网盘搜索速度快,资源丰富,我所钟爱用的。
  • 全文搜索 MATCH() 函数 全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中 ...
  • 首先要弄清楚是自己的站内检索,还是对网络的检索?如果仅仅检索自己本站里面的东西很简单,在apache上把lucene下载下来,里面有个很好的例子,再去找找相关资料就行了,如果想对中文分词做好点,去看看庖丁分词法.
  • 1、首先,到域名查询中心,比如万网、新网或者能查询域名所有者的地方去查询域名的注册信息,是否以前被注册过(就是我们常用的Whois查询)。如果域名曾经被注册过,我们就需要关心一下这个域名是否有过不良记录。 2、通过在Google中(site:域名),看下是否有记录,然后查看下反向链接,利用(link:域名)或者(domain:域名)可以到一些提供查询反向连接的网站去查询或者自己到搜索引擎利用命令查询。如果存在反向连接,而没有该站点被搜索引擎收录,那么这个域名很有可能被K过了,也就是存在不良记录。 3、直接输 ...
  • 在浩如烟海的Internet上,特别是其上的Web(World Wide Web万维网)上,不会搜索,就不会上网。网虫朋友们,你了解搜索引擎吗?它们是怎么工作的?你都使用哪些搜索引擎?今天我就和大家聊聊搜索引擎的话题。 一、搜索引擎的分类 获得网站网页资料,能够建立数据库并提供查询的系统,我们都可以把它叫做搜索引擎。按照工作原理的不同,可以把它们分为两个基本类别:全文搜索引擎(FullText Search Engine)和分类目录Directory)。 全文搜索引擎的数据库是依靠一个叫“网络机器人(Spi ...
  • 这方面的书还是比较多的,我所看过的有《搜索引擎技术》、《个性化搜索引擎原理与技术》、《搜索引擎原理、实践与应用》。此外还有很多基于开源软件如Lucene、nutch的开发搜索引擎的书籍,其中也介绍了不少关于原理方面的东西,而且更加面向应用。
  • 全文搜索 MATCH() 函数 全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中 ...
  • lucene的效率没有问题,你可以100W条记录的索引放在一台机器上,用nutch分开检索的算法,或者用hadoop存储索引,自己写一个indexsearcher,但是需要注意各个机器上的结果是本地最优不是全局最优的结果,如果想全局最优的结果还得采用全局频率计数(Nutch现在有没有我不清楚),或者放开各个机器返回结果的数量,从算法理论的角度上最大可能的获得最优解。100W记录的响应我测试过,应该可以满足要求。等你遇到什么问题,可以再联系,lucene后面的基准测试你也可以看看。 老吴
  • http://baike.baidu.com/view/371811.htm lucene是一款开源的搜索引擎工具,你可以用这个!