什么是Solr搜索

我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理。

当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂。

流程图

这是一个非常简单的流程图:

User:即需要搜索的用户。

Raw Data:需要搜索的内容,当然是源数据,可能是文本文件,可能是数据库的数据,可能是XML等等。

Index:有格式的数据。

其实从图中可以看出来:

  1. Solr搜索非常类似于读写数据库的过程。
  2. Solr搜索最主要的两个问题(细节已经封装好):
    1. 怎样从元数据合理组织格式化成Index
    2. 怎样根据关键字从Index中调取相关数据(排序、模糊查询等等)。

类比一下,Index就相当于数据表,里面有很多记录,我们需要做的就是设计数据表的格式,有哪些列。并且根据关键字搜索。

Solr综述

Solr其实是一个WebApp,在官网下载后将war包放在web'容器下便可以直接运行,你自己的web项目通过HTTP请求的方式和Solr交互。当然需要现在Solr中生成索引库(类似不同的数据表)。HTTP请求中带有相关参数(关键字、需要搜索的索引库、排序规则….)。那么想爱先简单介绍下一些相关的概念:

索引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,分词等等。

先看看整体结构:

  1.  
  2.   <schema name="Artist" version="1.1">
  3.    <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
  4.    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
  5.    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
  6.   <field name="ID" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
  7.    <field name="Name" type="text_ik" indexed="true" stored="true"/>
  8.    <field name="Name_Exact" type="string" indexed="true" stored="true" />
  9.    <field name="SpaceID" type="long" indexed="true" stored="true"/>
  10.    <field name="PinYin" type="text_general" indexed="true" stored="true"/>
  11.    <field name="SongNum" type="int" indexed="true" stored="true"/>
  12.  
  13.    <copyField source="Artist_Name" dest="Artist_Name_Exact" />
  14.  <!-- field to use to determine and enforce document uniqueness. -->
  15.  <uniqueKey>ID</uniqueKey>
  16.  
  17.  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  18.  <defaultSearchField>ID</defaultSearchField>
  19.  
  20. <!-- Chinese -->
  21.    <fieldType name="text_ik" class="solr.TextField">
  22.         <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  23.         <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  24.    </fieldType>
  25.  
  26.  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  27.  <solrQueryParser defaultOperator="OR"/>
  28. </schema>

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。

  1. <copyField source="Name" dest="Name_Exact" />

这是一个很有用的东西,从名字就能看出来是赋值Field,最大的作用便是可以让一个Field有多个不同的Type。

比如Name一个可以设置为text_ik(分词器,可以看我的博客:三、Solr多核心及分词器(IK)配置)

一个设置为string

那么模糊搜索时,可以使用Name,精确搜索时使用Name_Exact。

Solrconfig.xml

Scheme.xml是对索引库中Documents的配置,那么solrconfig就是对索引库的整体配置。配置requestHandler,有点类似于filter,就是在请求前后对请求进行预处理。这个之后碰到具体情况再具体分析,因为一般情况下设置好了之后,极少需要改动此文件。

总结

其实我个人使用Solr后觉得,如上面画的简单的流程图,最重要的两个问题:

  1. 查询条件

    查询哪些Field,用什么方式查询,什么排序,比如按照更新时间排序,还是在搜索歌曲时HQ、SQ优先等等,主要用到了Url参数、solrconfig中的requestHandler。

  2. Index的设计

    这是重中之重,我觉得大部分情况下应该都是使用solr从数据库中读取数据生成索引,这就要求原来的数据库设计就要比较合理,如果原来的数据库比较乱,那么就需要大量的SQL将表联结等等操作,并且出错的概率也高。

一、Solr综述的更多相关文章

  1. 三、Solr多核心及分词器(IK)配置

    多核心的概念 多核心说白了就是多索引库.也可以理解为多个"数据库表" 说一下使用multicore的真实场景,比若说,产品搜索和会员信息搜索,不使用多核也没问题,这样带来的问题是 ...

  2. Solr多核心及分词器(IK)配置

    Solr多核心及分词器(IK)配置   多核心的概念 多核心说白了就是多索引库.也可以理解为多个"数据库表" 说一下使用multicore的真实场景,比若说,产品搜索和会员信息搜索 ...

  3. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  4. solr中Cache综述

    一.概述 Solr查询的核心类就是SolrIndexSearcher,每个core通常在同一时刻只由当前的SolrIndexSearcher供上层的handler使用(当切换SolrIndexSear ...

  5. 创建solr集群简述

    综述: 用两台服务器,每台服务器上启动两个solr实例(端口分别为8983.7574),即一共有2x2=4个节点.4个节点分散在两个分片上,每台机器上存放两个分片的各一个replica,这样等于每台机 ...

  6. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  7. Solr 排除查询

    前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...

  8. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  9. [Solr] (源) Solr与MongoDB集成,实时增量索引

    一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml.js ...

随机推荐

  1. PHP对表单提交特殊字符的过滤和处理

    PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_str ...

  2. MySQL数据库my.cnf配置文件注释详解

    我们知道,在MySQL数据库安装完成后,要对my.cnf配置文件进行适当的修改才能充分利用MySQL数据库的功能.但是对于初学者来说,修改my.cnf配置文件似乎是一个比较难的过程.为了解决这个问题, ...

  3. office2010删除多余空行

    选择 ctrl+H,弹出 "查找和替换"对话框,在"查找内容"输入"^p^p",并在"替换为"输入"^p&qu ...

  4. redis例子

    http://www.cnblogs.com/edisonfeng/p/3571870.html

  5. iOS9中通过UIStackView实现类似大众点评中的效果图

    效果图如下: 实现思路 整体可以看做为一个大的UIStackView(排列方式水平)包括一个子UIStackView(排列方式垂直),其中左边包括一个图片,右边的UIStackView中可以看做包括三 ...

  6. 告诉你GetDC()没有释放造成的后果

    最近做的项目中需要显示视频监控窗口,从采集卡中读到图像的数据,需要实时显示出来,而且速度比较快. 由于比较简单,就直接使用了GDI画图,以前复杂的都用openGL啥的工具了,这次这个简单,就直接用GD ...

  7. Oracle数据库之事务

    Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...

  8. jquery上传控件个人使用

    转了一篇jquery的上传控件使用博文,但是,经过测试貌似不行,自己研究了一下,效果实现.记下,以后使用. 下载“Uploadify”,官方版本为php的,很多文件不需要,删除带.php的文件. &l ...

  9. 兄弟连面试宝典php

    学历这个事情是企业招聘经常设置的一道门槛,我们不能说学历高就能力高,也不能说学历低能力就差,那如何辩证回答这个问题呢?回答提示:学历不一定完全代表能力,虽然我的学历不够硬但是我会在技术上更努力更认真, ...

  10. arclist标签和list标签区别

    很多站长朋友在刚入门织梦的时候对织梦的标签存在很多的困惑,关于arclist标签和list标签,甚至不知道啥时候用arclist,啥时用list标签.arclist 为自由列表,全局模板中都生效,一般 ...