什么是Solr搜索

一、Solr综述

 

什么是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. <schema name="SpaceVideo" version="1.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="Artist_ID" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
  7.    <field name="Artist_Name" type="text_ik" indexed="true" stored="true"/>
  8.    <field name="Artist_Name_Exact" type="string" indexed="true" stored="true" />
  9.    <field name="Artist_NickName" type="text_ik" indexed="true" stored="true"/>
  10.    <field name="Artist_SpaceID" type="long" indexed="true" stored="true"/>
  11.    <field name="Artist_Piclink1" type="string" indexed="false" stored="true"/>
  12.    <field name="Artist_Piclink2" type="string" indexed="false" stored="true"/>
  13.    <field name="Artist_Piclink3" type="string" indexed="false" stored="true"/>
  14.    <field name="Artist_PinYinInitial" type="text_general" indexed="true" stored="true"/>
  15.    <field name="Artist_IconNo" type="string" indexed="false" stored="true"/>
  16.    <field name="Artist_AuthDes" type="string" indexed="false" stored="true"/>
  17.    <field name="Artist_NameQP" type="text_general" indexed="true" stored="true"/>
  18.    <field name="Artist_SongNum" type="int" indexed="true" stored="true"/>
  19.    <field name="Artist_MVNum" type="int" indexed="true" stored="true"/>
  20.    <field name="Artist_CategoryID" type="string" indexed="true" stored="true"/>
  21.    <field name="Artist_MobilePic" type="string" indexed="true" stored="true"/>
  22.    <field name="Artist_Showing" type="string" indexed="true" stored="true"/>
  23.  
  24.    <copyField source="Artist_Name" dest="Artist_Name_Exact" />
  25.  <!-- field to use to determine and enforce document uniqueness. -->
  26.  <uniqueKey>Artist_ID</uniqueKey>
  27.  
  28.  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  29.  <defaultSearchField>Artist_ID</defaultSearchField>
  30.  
  31. <!-- Chinese -->
  32.    <fieldType name="text_ik" class="solr.TextField">
  33.         <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  34.         <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  35.    </fieldType>
  36.  
  37.  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  38.  <solrQueryParser defaultOperator="OR"/>
  39. </schema>

FieldType代表Field的类型,可以自定义也可以使用Solr提供的Type,具体支持的Type可以参考Solr文档,其中需要稍微解释一下的是string,实现的class是solr.StrField,string的意思是将Field当成字符串,那么如果在搜索时,不会进行分词。只能整体匹配,例如将ArtistName设置为string,那么当搜索周杰伦的时候,只有ArtistName完全和周杰伦相同才会被匹配,周杰,周杰伦你好…这些都不会匹配,这个在精确查找时很有用。

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是否索引,意思就是能否被搜索到,如果ArtistName设置为false,那么搜索ArtistName=周杰伦是没有结果的。

Stored:表示此Field是否被存储。

multiValued:表示此Field能否有多值,即ArtistCategory可以有多个值:如原创歌手、华语男歌手等等。默认false,Unique Field必须显式设置为false。

Required:表示此Field是否能为空,默认false,Unique Field必须设置为true。

  1. <copyField source="Artist_Name" dest="Artist_Name_Exact" />

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

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

一个设置为string

那么模糊搜索时,可以使用Artist_Name,精确搜索时使用Artist_Name_Exact。

Solrconfig.xml

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

总结

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

  1. 查询条件

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

  2. Index的设计

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

作者<ahref="http: www.cnblogs.com="" edwinchen="" "="" target"_blank"="">瞪着太阳的乌鸦

什么是Solr搜索的更多相关文章

  1. 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)

    关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...

  2. Solr搜索技术

    Solr搜索技术 今日大纲 回顾上一天的内容: 倒排索引 lucene和solr的关系 lucene api的使用 CRUD 文档.字段.目录对象(类).索引写入器类.索引写入器配置类.IK分词器 查 ...

  3. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  4. solr搜索应用

    非票商品搜索,为了不模糊查询影响数据库的性能,搭建了solr搜索应用,php从solr读取数据

  5. solr搜索结果转实体类对象的两种方法

    问题:就是把从solr搜索出来的结果转成我们想要的实体类对象,很常用的情景. 1.使用@Field注解 @Field这个注解放到实体类的属性[字段]中,例如下面 public class User{ ...

  6. spring data solr 搜索关键字高亮显示

    spring data solr 搜索关键字高亮显示 public Map<String, Object> highSearch(Map searchMap) { Map map = ne ...

  7. Solr搜索基础

    本例我们使用类库和代码均来自: http://www.cnblogs.com/TerryLiang/archive/2011/04/17/2018962.html 使用C#来模拟搜索.索引建立.删除. ...

  8. 一个Solr搜索实例,增删改查+高亮+分页

    今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...

  9. Solr搜索结果说明

    在admin页面,输入相关内容后,会返回xml格式的内容.说明如下: [html] view plaincopy <?xml version="1.0" encoding=& ...

随机推荐

  1. KMP该算法解释(最长公共子)

    一个:介绍KMP算法之前,首先解释一下BF算法 (1)BF算法(传统的匹配算法,是最简单的算法) BF算法是一种常见的模式匹配算法,BF该算法的思想是目标字符串S模式串的第一个字符P的第一个字符,以匹 ...

  2. Ajax基础知识(一)

    随便在百度谷歌上输入Ajax都会出现一大堆的搜索结果,这已经不再是什么新奇的技术了.但若从一开始就学习了ASP.Net,使用功能齐全的Visual Studio集成开发工具,或许未必能对访问一个动态网 ...

  3. log4j与commons-logging,slf4j的关系(转)

    前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...

  4. android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方式

    近期实在受不了eclipse的"迟钝",准备入手Android studio开发环境,可是貌似不太顺利,安装成功了Android studio,在线更新Android adk的时候 ...

  5. Android - 采用ApiDemos得知Android开展

    采用ApiDemos得知Android开展 本文地址: http://blog.csdn.net/caroline_wendy 位置: android-sdk/samples/android-20/l ...

  6. 怎样批量把excel中已显示的科学计数法取消

    作者:iamlaosong 把一文本文档拷贝到EXCEL中时,当中一列数字所有变成科学计数法,这些数事实上是条码号,不需进行运算,怎样能够取消科学计算法,将数字显示成原来的样子呢?一般方法例如以下: ...

  7. 假设动态运行java文字,当在脚本式配置,这是非常方便的

    package com.bfrj.core.groovy; import java.util.HashMap; import java.util.Map; import org.jeecgframew ...

  8. Repository模式

    Repository模式的两种写法与疑惑 现如今DDD越来越流行,园子里漫天都是介绍关于它的文章.说到DDD就不能不提Repository模式了,有的地方也叫它仓储模式. 很多时候我们对Reposit ...

  9. 使用 Eclipse 的 SVN 主要插件创建项目/支/标签

    原文 阅读 Mark Phippard 该博客以及<Subversion 与版本号控制>之后,我了解到 分支/标签 是 SVN 非常棒的特性之中的一个.但我在使用推荐的 "tru ...

  10. crawler_爬虫开发的准备工作【工具】

    俗话说工欲善其事必先利其器,做java网络爬虫开发分析网页的分析工具,抓包工具比不可少,一下是个人常用的几个工具. 1.firefox低版本是为了支持httpwather , ie各个版本都支持htt ...