solr

 (一)什么是solr?

概要简介:

   solr是一个独立的企业级搜索应用服务器,对外提供类似web-service的API接口。是一个高性能,基于Lucene(开源搜索引擎框架)的全文搜索服务器。实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎

   全文检索是指是计算机索引程序扫描文章中的每一个词,对每个词都建立索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的检索进行查找,并将查找结果返回给用户。


  工作方式:

    文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过HTTP收到一个XML/JSON响应来实现。主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大的Data Schema来定义字段、类型和设置文本分析,提供基于Web的管理界面。

    存储资源是以Document为对象进行存储的。每个文档由一系列的Field构成,每个Field表示资源的一个属性。solr中每个Document需要有能唯一标识其自身的属性,默认情况下这个属性的名字是id。


  使用对比:

   1、Solr   VS  Lucene

      Lucene是一个全文检索引擎工具包,它只是一个jar包,不能独立运行,对外提供服务。

      Solr是一个全文检索服务器,它可以单独运行在servlet容器,可以单独对外提供搜索和索引功能。Solr比lucene在开发全文检索功能时,更快捷、更方便。solr是一个基于Lucene的搜索引擎,可以实现全文搜索。同时对其进行了扩展,提供了比Lucene更为丰富的查询语


   2、Solr  VS  ElasticSearch

     ElasticSearch是一个实施的分布式搜索和分析引擎,完全支持Apache Lucene的接近实时的搜索。而Solr建立索引后,实时索引搜索效率下降。但是在不建索引的情况下,Solr的搜索效率明显高于ElasticSearch。

     ElasticSearch处理多租户不需要特殊配置,而Solr则需要更多的高级设置。

     Solr支持多种格式的数据,ElasticSearch仅支持json文件格式。

(二)了解一下全文搜索的工具

1 Lucene

     java家族中最出名的一个开源搜索引擎,在Java世界中已经是一个标准的全文搜索程序,它提供一个完整的查询引擎和索引引擎。

     官方主页:http://lucene.apache.org/

2 solr

     solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,是基于Lucene的全文检索服务器。

     官方主页:http://lucene.apache.org/solr/

3 Elasticsearch

     Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源,分布式的搜索引擎,设计用于云计算中,能够实现实时搜索。

(三)了解一下Solr的特点:

1 通过HTTP协议处理搜索和查询速度。

2 增加了缓存功能,让响应速度更快。

3 提供了一个基于web的管理界面。

4 查询结果分类(facet)

5 支持分布式,支持大规模的部署(solrcloud Solr4.0版本开始)
(四)下面讲解Solr安装:

下载 :http://archive.apache.org/dist/lucene/solr/

类型说明  solr-x.x.x.tgz 对于Linux / Unix / OSX系统   solr-x.x.x.zip 对于Microsoft Windows系统   solr-x.x.x-src.tg Solr源代码。

解压: tar -zxvf  solr-x.x.x.tgz

启动:进入bin目录   运行命令    ./solr  start  -p  端口号

访问:http://localhost:端口号 (默认8983)/solr/#/

关闭:进入bin目录   运行命令  ./solr  stop -all

solr的管理页面说明

solr 服务器管理界面可以查看系统状态、solr设置、分词检测、查询索引、增减core、查看日志等

1.Dashboard(仪表盘)

访问http://localhost:8983/solr时,出现该主页面,可查看到solr运行时间、solr版本,系统内存、虚拟机内存的使用情况
  •  

这里写图片描述

2.Logging(日志)

显示solr运行出现的异常或错误
  •  

这里写图片描述

3.Core Admin (core管理)

主要有Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重新加载核心),Optimize(优化索引库)
Add Core是添加core:主要是在instanceDir对应的文件夹里生成一个core.properties文件
这里写图片描述

 

name:给core起的名字;
instanceDir:与我们在配置solr到tomcat里时的solr_home里新建的core文件夹名一致;
dataDir:确认Add Core时,会在new_core目录下生成名为data的文件夹
config:new_core下的conf下的config配置文件(solrconfig.xml)
schema: new_core下的conf下的schema文件(schema.xml)
这里写图片描述
确认Add Core时,会在new_core下生成data文件夹,与core.properties文件。core.properties文件里内容如下:
这里写图片描述

4.Java Properties

可查看到java相关的一些属性的信息

5. Core Selecter(core选择器)

需要在Core Admin里添加了core后才有可选项,这里以已经添加好的ims_advertiser_cor

5.1 overview(概览)

包含基本统计如当前文档数;和实例信息如当前核心的配置目录;
这里写图片描述

5.2 Analysis(分析)

检验分词效果,我们对companyName字段进行了分词 ( 至于哪些字段能分词,取决于在schema.xml文件里配置该字段时的type是否为配置的分词器类型text_ik)

<field name="companyName" type="text_ik" indexed="false" stored="true" multiValued="false" />
//这里的text_ik就是下面name属性的值

 <!-- 配置IK分词器start -->
 <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
     <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" isMaxWordLength="false"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>

    <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" isMaxWordLength="false"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

这里的高亮就是背景色是灰色
这里写图片描述

5.3 Dataimport(从数据库导入数据)

前提是已经配置好了相关的配置,详情参见:Solr从数据库导入数据
这里写图片描述

Comman选项:full_import:全导入;delta_import:增量导入。
所谓delta-import主要是对于数据库(也可能是文件等等)中增加或者被修改的字段进行导入。主要原理是利用率每次我们进行import的时候在solr.home\conf下面生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息。这个文件如下:
#Tue Jul 19 10:15:50 CST 2016
advertiser.last_index_time=2016-07-19 10:15:49
last_index_time=2016-07-19 10:15:49
其实last_index_time是最近一次索引(full-import或者delta-import)的时间。
通过比较这个时间和我们数据库表中的timestamp列即可得出哪些是之后修改或者添加的。

Verbose:
Clean: 在索引开始构建之前是否删除之前的索引,默认为true
Commit: 在索引完成之后是否提交。默认为true
Optimize: 是否在索引完成之后对索引进行优化。默认为true
Debug: 是否以调试模式运行,适用于交互式开发(interactive development mode)之中。
请注意,如果以调试模式运行,那么默认不会自动提交,请加参数“commit=true”

Entity: entity是document下面的标签(data-config.xml)。使用这个参数可以有选择的执行一个或多个entity 。使用多个entity参数可以使得多个entity同时运行。如果不选择此参数那么所有的都会被运行。
Start,Rows:
Custom Parameters:
Excute:执行导入。
Refresh Status:刷新后才能看到数据发生了变化,如果刷新后数据还是0,说明未导入。


5.4Documents (索引文档)

索引的相关操作,如:增加,修改,删除等,例如我们要增加一个索引(companyName)的办法:
a. 先要在solr 的D:\solr_home\mycore1\conf 的 schema.xml配置文件下,增加相关的字段field

<field name="companyName" type="text_ik" indexed="false" stored="true" multiValued="false" />

否则会出现如下错误:

Status: error
Error: Bad Request
Error:
{
  "responseHeader": {
    "status": 400,
    "QTime": 1
  },
  "error": {
    "msg": "ERROR: [doc=126] unknown field 'companyName'",
    "code": 400
  }
}

b. 在如下页面,选择/update ,文档格式选择json ,然后submit 提交。这样 索引就增加上了。修改与增加一样,都是/update ,删除为/delete
成功之后,我们去query里查询数据就能查到我们刚添加的数据.

这里写图片描述

Request-Handler(qt): 要进行的操作(update\delete)
Document Type:类型,有JSON、XML等格式
Document(s): 内容,手动写的内容。
Commit Within:
Overwrite: 为true,说明如果id重复则覆盖以前的值;为false说明如果id重复不覆盖以前的值.
Boost: 好像是什么版本,没用过

5.5 Files文件夹

solr_home下的core下的conf下的相关文件,可单击查看里面的内容.
这里写图片描述

5.6 Query(查询页面),查询的结果要显示哪个字段,就得将schema.xml文件配置字段时的stored属性设为true.

查询索引的文档,包含是否存在,排序是否正确等
这里写图片描述

进入该页面后,直接点击Execute Query时,在右侧会生查回数据:
这里写图片描述

Request-Handler(qt):
q: 查询字符串(必须的)。:表示查询所有;keyword:东看 表示按关键字“东看”查询
fq: filter query 过滤查询。使用Filter Query可以充分利用Filter Query Cache,提高检索性能。作用:在q查询符合结果中同时是fq查询符合的(类似求交集),例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。
sort: 排序。格式如下:字段名 排序方式;如advertiserId desc 表示按id字段降序排列查询结果。
start,rows:表示查回结果从第几条数据开始显示,共显示多少条。
fl: field list。指定查询结果返回哪些字段。多个时以空格“ ”或逗号“,”分隔。不指定时,默认全返回。
df: default field默认的查询字段,一般默认指定。
Raw Query Parameters:
wt: write type。指定查询输出结果格式,我们常用的有json格式与xml格式。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、phps、custom。
indent: 返回的结果是否缩进,默认关闭,用 indent=true | on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
debugQuery: 设置返回结果是否显示Debug信息。
dismax:
edismax:
hl: high light 高亮。hl=true表示启用高亮
hl.fl : 用空格或逗号隔开的字段列表(指定高亮的字段)。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高 亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用 hl.requiredFieldMatch选项。
hl.simple.pre:
hl.requireFieldMatch: 如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到
hl.usePhraseHighlighter:如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
hl.highlightMultiTerm:如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
facet:分组统计,在搜索关键字的同时,能够按照Facet的字段进行分组并统计。
facet.query:Facet Query利用类似于filter query的语法提供了更为灵活的Facet.通过facet.query参数,可以对任意字段进行筛选。
facet.field:需要分组统计的字段,可以多个。
facet.prefix: 表示Facet字段值的前缀。比如facet.field=cpu&facet.prefix=Intel,那么对cpu字段进行Facet查询,返回的cpu都是以Intel开头的, AMD开头的cpu型号将不会被统计在内。
spatial:
spellcheck: 拼写检查。
 

配置

schema.xml这个配置文件的根本目的是为了通过配置告诉Solr如何建立索引。

solr的数据结构如下:

    document:一个文档、一条记录
    field:域、属性

solr通过搜索某个或某些field,返回若干个符合条件的document,或者按搜索的score排序返回。

如果跟数据库对比,document相当于数据库的表,field相当于表中的字段。而schema.xml就是为了定义一个表的结构(定义各个field的名字、类型、约束、等等)。

schema.xml的基本结构如下:

<schema>

    <types>

    <fields>

    <uniqueKey>

    <copyField>

</schema>

常用的配置说明:

field:定义一个document中的各个fields

  name:必填。该field的名字。前后都有下划线的name是系统保留的名字,比如“_version_”

  type:必填。类型,对应于fieldType的name

  default:该field的缺省值

  indexed:true/false,是否为该field建立索引,以让用户可以搜索它、统计它(facet)

  stored:true/false,定义这个field是否可以返回给查询者

  multiValued:true/false,是否可以容纳多个值(比如多个copyField的dest指向它)。如果是true,则该field不能被排序、不能作为uniqueKey

  required:true/false,告诉solr这个field是否接受空值,缺省为false

  docValues:true/false,建立document-to-value索引,以提高某些特殊搜索的效率(排序、统计、高亮)

copyField:把一个field的内容拷贝到另外一个field中。一般用来把几个不同的field copy到同一个field中,以方便只对一个field进行搜索

  source:被拷贝的field,支持用通配符指定多个field,比如:*_name

  dest:拷贝到的目的field

  maxChars:最大字符数

uniqueKey:指定一个field为唯一索引

fieldType:定义field的类型,包括下面一些属性

  name:必填,被field配置使用

  class:必填,filedType的实现类。solr.TextField是路径缩写,"等价于"org.apache.solr.schema.TextField"

  multiValued:是否允许多值

  positionIncrementGap:指定mutiValued的距离

  ananlyzer:如果class是solr.TextField,这个配置是必填的。告诉solr如何处理某些单词、如何分词,比如要不要去掉“a”,要不要全部变成小写……

  type:index或query

  tokenizer:分词器,比如:StandardTokenizerFactory

  filter:过滤器,比如:LowerCaseFilterFactory

dynamicField:用通配符定义一个field来存在没有被field定义的漏网之鱼

  name:使用通配符,比如“*_i”,来处理类似“cost_i”之类的field

(五)配置中文分词器:

solr本身对中文分词的处理不是太好,所以中文应用很多时候都需要额外加一个中文分词器对中文进行分词处理,ik-analyzer就是其中一个不错的中文分词器。

下载:

使用:

配置:

(六)常用命令总结  

启动命令:

https://blog.csdn.net/matthewei6/article/details/50620600

https://blog.csdn.net/qq_27231343/article/details/53707696

查询语句 :

参数:https://blog.csdn.net/zhufenglonglove/article/details/51518846

语法:https://blog.csdn.net/ldds_520/article/details/52836903

(七)综合使用

7.1整体介绍

https://blog.csdn.net/shao_zhiqiang/article/details/51879763

https://blog.csdn.net/qq_33854869/article/details/77498989

7.2具体应用

a.项目中使用solr

https://blog.csdn.net/frankcheng5143/article/details/71159936

b.tomcat中部署solr(可以不部署,因为有内嵌的jetty)

https://blog.csdn.net/wxyora/article/details/78390661

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值