咱们常常会用到搜索功能,因此也比较熟悉,这里就简单的介绍一下搜索的原理。 web
固然只是介绍solr的原理,并非搜索引擎的原理,那会更复杂。 数据库
流程图 json
这是一个很是简单的流程图: 数据库设计
User:即须要搜索的用户。 ui
Raw Data:须要搜索的内容,固然是源数据,多是文本文件,多是数据库的数据,多是XML等等。 搜索引擎
Index:有格式的数据。 spa
其实从图中能够看出来: 设计
类比一下,Index就至关于数据表,里面有不少记录,咱们须要作的就是设计数据表的格式,有哪些列。而且根据关键字搜索。 orm
Solr实际上是一个WebApp,在官网下载后将war包放在web'容器下即可以直接运行,你本身的web项目经过HTTP请求的方式和Solr交互。固然须要如今Solr中生成索引库(相似不一样的数据表)。HTTP请求中带有相关参数(关键字、须要搜索的索引库、排序规则….)。那么想爱先简单介绍下一些相关的概念: xml
索引Index,文档Docements,域Fields
Solr中数据最小单元为Field,好比Name、Age。Documents是一个具体的对象,如人。举例说明:Edwin是一我的,那么能够将Edwin抽象为一个Document,这个Document包含不少Fields,Name、Age、Sex….。一个索引库Index由许多Documents组成。
Index(Student) ß Docements(Edwin、AngelaBaby…) ß Fields(Name、Age…)
是否是很像数据库的模型? 其实彻底能够把这个理解为数据库… 而且Index还真的有主键的概念,叫作Unique Field。
查询Query
上面解决了数据格式化成Index的问题,那么还剩下怎样根据关键字查询搜索结果的问题,先举个例子:
http://localhost:8983/solr/Artist/select?q=Artist_Name:周杰伦 &wt=json&indent=true
这就是web项目和Solr交互的一个Url
Localhost:8983/solr 这个事Solr项目
Artist是索引库Index
q=Artist_Name:周杰伦
q表明Query 意思是查询Artist_Name为周杰伦的数据
wt=json 指结果按照Json形式返回
indent=true 返回的数据格式化(也就是好看一点~)
经过这一个简单的请求,便可以明白Solr请求的一个基本过程了,有什么需求加什么参数,以后Solr解析请求,根据本身的匹配规则,一个很复杂的公式,计算全部Documents的得分,得分高的优先返回。最后Web项目得到获得搜索结果,格式化输出。
Schema.xml
这个文件其实就是对Index的配置,包括Field的类型,Unique Field,分词等等。
先看看总体结构:
FieldType表明Field的类型,能够自定义也可使用Solr提供的Type,具体支持的Type能够参考Solr文档,其中须要稍微解释一下的是string,实现的class是solr.StrField,string的意思是将Field当成字符串,那么若是在搜索时,不会进行分词。只能总体匹配,例如将Name设置为string,那么当搜索周杰伦的时候,只有Name彻底和周杰伦相同才会被匹配,周杰,周杰伦你好…这些都不会匹配,这个在精确查找时颇有用。
Unique Field :实际上是主键的意思,就是说在全部的Documents中被设置成Unique的Field只能有惟一值。固然在Index生成的时候,不用去重,Solr并不会报错,好比向Solr输入
ID:1 Name:张三
ID:1 Name:李四
若是ID为Unique Field,那么Solr可能会根据前后顺序,只会存储一个ID为1的Document,剩余重复ID的Document会被忽略。
Field中还有不少属性:
Name和Type就不说了
Indexed:表示此Field是否索引,意思就是可否被搜索到,若是Name设置为false,那么搜索Name=周杰伦是没有结果的。
Stored:表示此Field是否被存储。
multiValued:表示此Field可否有多值,即Category能够有多个值:如原创歌手、华语男歌手等等。默认false,Unique Field必须显式设置为false。
Required:表示此Field是否能为空,默认false,Unique Field必须设置为true。
这是一个颇有用的东西,从名字就能看出来是赋值Field,最大的做用即是可让一个Field有多个不一样的Type。
好比Name一个能够设置为text_ik(分词器,能够看个人博客:3、Solr多核心及分词器(IK)配置)
一个设置为string
那么模糊搜索时,可使用Name,精确搜索时使用Name_Exact。
Solrconfig.xml
Scheme.xml是对索引库中Documents的配置,那么solrconfig就是对索引库的总体配置。配置requestHandler,有点相似于filter,就是在请求先后对请求进行预处理。这个以后碰到具体状况再具体分析,由于通常状况下设置好了以后,极少须要改动此文件。
其实我我的使用Solr后以为,如上面画的简单的流程图,最重要的两个问题:
查询哪些Field,用什么方式查询,什么排序,好比按照更新时间排序,仍是在搜索歌曲时HQ、SQ优先等等,主要用到了Url参数、solrconfig中的requestHandler。
这是重中之重,我以为大部分状况下应该都是使用solr从数据库中读取数据生成索引,这就要求原来的数据库设计就要比较合理,若是原来的数据库比较乱,那么就须要大量的SQL将表联结等等操做,而且出错的几率也高。