赞
踩
原来的方法和实现搜索功能的流程图:
传统的搜索引擎技术,在一般数据库数据量比较小,用户量比较小的时候是比较常见的
但是在数据量增加到一定的量级的时候,数据库的压力就会变得很大,查询的速度会很慢,我们需要更好的解决方案来分担数据库的压力
使用全文检索技术的解决方案:
为了解决数据库的压力和速度的问题,我们的数据库变成了索引库,我们通过Lucene的API来操作服务器上的索引库,这样完全和数据库进行了隔离,从索引库中查询数据非常的快,但是在创建索引库的过程很慢,但是这个不影响我们在业务上的使用.
所谓顺序扫描法,在Windows中磁盘搜索框中搜索一个字符串的时候使用的就是顺序扫描法,打开第一个文件夹把里面的文件从头看到尾,再打开第二个文件夹...这样以此类推直到遍历完磁盘中的所有文件为止,就叫顺序扫描法,这种搜索方式如果数据量大速度很慢
所谓倒排意思就是顺序扫描法是先找文档从文档中找出搜索项
倒排索引法是先在索引中找关键词,再根据索引去找文件,所以是倒序
Lucene会对文档建立倒排索引:
1.提取资源中的关键信息,建立索引(目录)
2.搜索时,根据关键字(目录),找到资源的位置
例如我们的新华字典查询汉字,查字的时候先查目录(索引),找到我想要找的字的页数,在根据这个页数去文档中找汉字
创建索引流程:
1.对于互联网上的网页,可以使用工具将网页抓取到本地生成html文件
2.数据库中的数据,可以连接数据库用select语句查询
3.文件系统中的某个文件用I/O流的方式读取文件的内容
我们可以将数据库中的一条记录当成一个Document,在这个Document中数据库中的列叫做Document中的域
注意:每个Document都可以有多个Filed(数据库中一条记录有多个字段),不同的Document可以有不同的Field(数据库中不同的记录有不同的字段),同一个Document可以有相同的Field(数据库中一条记录中允许有两个Id)(域名和域值都相同)
将原始内容创建为包含域(Filed)的文档(Document),需要在对域中的内容进行分析,分析成一个个的单词
比如:源文档的内容:
Lucene is a Java full-text search engine. Lucene is not a complete
application, but rather a code library and API that can easily be used
to add search capabilities to applications.
分析后得到的词:
lucene、java、full、search、engine。。。。
对文档分析(分词)后得到的词汇进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的词汇从而找到Document文档
查询索引流程:
搜索就是用户输入关键字,根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容
Field是文档中的域,包括Field名和Field值两部分,一个文档可以包含多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容
Field属性:
是:做分词处理,即将Field值进行分词,分词的目的是为了索引
比如:商品名称,商品描述等,这些内容用户要输入关键字搜索,但是原文的格式大内容多,需要分词之后将每一个词汇进行索引
否:不分词
比如:商品id,身份证号,订单号
是:进行索引,将Field分词后的词进行索引,索引的目的是为了搜索
比如:商品名称,商品描述 分词后进行索引,订单号,身份证号不用分词但也要索引,这些将来都会作为查询条件
否:不索引
比如:图片路径,文件路径,不用作为查询条件的不用索引
是:将Field值存储在文档域中,存储在文档域中的Field才能从Document中获取
比如:商品名称,订单号,凡是将来要从Document中获取的Field都要存储
否:不存储Field值
比如:商品描述,内容较大的不用存储,如果要向用户战术商品描述可以从系统的关系数据库中获取
Field常用类型:
Field类 | 数据类型 | Analyzed 是否分词 | Indexed 是否索引 | Stored 是否存储 | 说明 |
StringField(FieldName, FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 这个Field用来构建一个字符串Field,但是不会进行分词,会将整个串存储在索引中,比如(订单号,身份证号等) 是否存储在文档中用Store.YES或Store.NO决定 |
LongField(FieldName, FieldValue,Store.YES) | Long型 | Y | Y | Y或N | 这个Field用来构建一个Long数字型Field,进行分词和索引,比如(价格) 是否存储在文档中用Store.YES或Store.NO决定 |
StoredField(FieldName, FieldValue) | 重载方法,支持多种类型 | N | N | Y | 这个Field用来构建不同类型Field 不分析,不索引,但要Field存储在文档中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader) | 字符串 或 流 | Y | Y | Y或N | 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. |
Solr就是上文进行比较提到的搜索引擎服务
Solr是Apache下的顶级开源项目,采用java开发,它是基于Lucene的全文搜索服务.
Solr可以独立运行在Jetty,Tomcat等这些Servlet容器中
使用Solr进行创建索引和搜索索引的实现方法很简单:
Lucene是一个开源的全文检索引擎工具包,不是一个完整的全文检索应用,Lucene只提供了完整的查询引擎和索引引擎,母的是为开发人员在目标系统中实现全文检索功能
1.解压之后文件目录结构
SolrHome是Solr服务运行的主目录,该目录包括的多个SolrCore目录,SolrCore目录中包含了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore,每个单独的SolrCore提供单独的搜索和索引服务
类似于mysql中有多个数据库
SolrHome目录
SolrCore目录
SolrCore里面的目录
步骤一:把solr.war复制到tomcat/webapps/下
步骤二:exampl/lib/ext/*.jar 复制到 solr/WEB-INF/lib 下
步骤三:配置solr服务器连接索引库(SolrHome)
详细步骤:
1.找一个Tomcat解压到Solr目录下
2.把 solr-4.10.3/example/webapps/下的solr.war包复制到Tomcat中的webapp中
3.新创建一个solr文件夹,把solr.war解压进去
4.把solr额外需要的jar包拷贝进解压后的solr.war中的WEB-INF/lib的拓展包中
5.把solr源码包中的example/solr(家目录)拷贝到和tomcat为统同级目录
6.为了tomcat中的solr能连接上和tomcat同级目录的solrhome(solr家),更改tomcat/webapps/solr/WEB.INF/web.xml配置文件
把solr的家目录配置上
7.配置完成启动tomcat
步骤一:在solr目录下创建一个IK文件夹,把IK的.zip包解压到IK文件夹下
步骤二:进入到解压后的IK目录下,找到IKAnalyzer.cfg.xml主配置文件,把拓展词配置文件打开
步骤三:在拓展词配置文件和停止分词配置文件配置自己想设置的词组
步骤四:将IK分词器的jar包复制进tomcat中的solr下的lib的拓展包下
步骤五:在webapps/solr/WEB-INF下创建一个classes文件夹,因为在java工程中的classpath路径在发布之后就对应着这个WEB-INF/classes文件夹,把核心配置文件.拓展和停止分词这三个配置文件复制到classes下
步骤六:去schame配置文件中配置一个域类型使用IK分词器,并指定一个域使用这个域类型
步骤七:重启tomcat
步骤八:在管理界面中使用分词器为IK的域进行测试:
步骤一:在Schame.xml配置文件中配置业务域.准备迎接新添加到索引库中的数据表中的字段
步骤二:由于需要把Mysql数据库中的数据导入到索引库中,所以需要Mysql的驱动包,并且把Mysql的数据存到索引库中还需要两个转换包
这三个包需要放到Solrhome家目录下,所以在家目录下的Collection1这个核中创建一个lib文件夹用于保存这三个jar包
数据库驱动包需要自己准备,两个转换包在solr的源代码包中的dist目录下:/root/solr/solr-4.10.3/dist的 solr-dataimporthandler-4.10.3.jar 和 solr-dataimporthandler-extras-4.10.3.jar这两个包 这三个包都复制到家目录下的lib包下
步骤三:找到与schame同级的solrconfig.xml这个核心配置文件,添加一个requestHandler
步骤四:在solrconfig.xml的同级目录下创建data-config.xml文件,配置数据源和查询数据
步骤五:重启tomcat
步骤六:进入后台管理界面进行导入
1.field
2.动态域
3.主键
代表主键域,每个文档中必须有一个id域
4.复制域
可以将多个Field复制到一个Field中,以便进行统一的 搜索,当创建索引时,Solr服务会自动将源域的内容复制到目标域中
定义目标域:
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
目标域必须要使用:multiValued="true"
5.域类型
8.solr后台管理页面上的查询
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。