1 什么是Solr
2 Solr和lucene区别
3 Solr的安装及配置、相关文件说明
1 什么是Solr
Solr它是一种开源的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。就是一个web工程。
Solr的特性包括:
- 高级的全文搜索功能
- 专为高通量的网络流量进行的优化
- 基于开放接口(XML和HTTP)的标准
- 综合的HTML管理界面
- 可伸缩性-能够有效地复制到另外一个Solr搜索服务器
- 使用XML配置达到灵活性和适配性
- 可扩展的插件体系
solr的工作机制:
- solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能。
- 业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可。
2 Solr和lucene区别
Solr与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的。
Solr和Lucene的本质区别有以下三点:1 搜索服务器,2 企业级,3 管理。
- Lucene本质上是搜索库,不是独立的应用程序,而Solr是。
- Lucene专注于搜索底层的建设,而Solr专注于企业应用。
- Lucene不负责支撑搜索服务所必须的管理,而Solr负责。
所以说,一句话概括 Solr: Solr是Lucene面向企业搜索应用的扩展。
3 Solr的安装及配置、相关文件说明
3.1 下载和安装
Solr 必须运行在Java1.6 或更高版本的Java 虚拟机中,运行标准Solr 服务只需要安装JRE即可,但如果需要扩展功能或编译源码则需要下载JDK 来完成。
官网下载地址
下载后解压文件如下:
安装solr,就是去部署它的war包。
- 将 solr 压缩包解压,并将server\solr-webap文件夹下有webapp文件夹,将之复制到Tomcat\webapps\目录下,并改成solr。
- 将 solr 压缩包中 server\lib\ext 中的 jar 全部复制到 Tomcat\webapps\solr\WEB-INF\lib目录中。
- 将 solr 压缩包中 server/resources /log4j.properties 复制到Tomcat\webapps\solr\WEB-INF\lib目录中。
- 创建一个D:\solr_home 的目录,并将 solr 压缩包中server/solr 目录复制D:\solr_home目录下。
- 打开Tomcat/webapps/solr/WEB-INF下的web.xml,增加如下配置内容(初始状态下该内容是被注释掉的)
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:/solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
将<env-entry-value>中的内容改成你的solrhome路径,这里是D:/solr_home。这项配置,主要是建立tomcat 与solr之间的关系的,它的作用是让tomcat找到你所配置的solr 目录。
- 重新启动tomcat,在浏览器输入http://localhost:8080/solr 即可出现Solr的管理界面。
3.2 Solr配置文件
(1)Solrhome
1、collection1:是一个solrcore,一个solrcore就是一个索引库。一个solr服务器上可以有多solrcore。每个索引库之间是相互独立的。
2、\solrhome\collection1\conf:是存放每个solrcore的个性配置。
(2)schema.xml
schema.xml位于solr/conf/目录下,类似于数据表配置文件,定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。
<schema name="OilGasInfo_Index" version="1.1">
<types>
<!--IKAnalyzer-->
<fieldType name="text" class="solr.TextField" autoGeneratePhraseQueries="false">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="4" positionIncrementGap="0"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="4" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="4" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="4" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="4" positionIncrementGap="0"/>
</types>
<fields>
<field name="docfullid" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<!-- general 根据代码中的索引域设置下面域-->
<field name="newsId" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="newsTitle" type="text" indexed="true" stored="true" multiValued="false" />
<field name="sourceUrl" type="string" indexed="true" stored="true" multiValued="false" />
<field name="content" type="text" indexed="true" stored="true" multiValued="false" />
<field name="newsTime" type="string" indexed="true" stored="true" multiValued="false" />
<field name="sourceNet" type="string" indexed="true" stored="false" multiValued="false" />
<field name="filePath" type="string" indexed="true" stored="true" multiValued="false" />
<field name="columnId" type="int" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- field to use to determine and enforce document uniqueness. -->
<uniqueKey>docfullid</uniqueKey>
<!-- field for the QueryParser to use when an explicit fieldname is absent -->
<defaultSearchField>newsTitle</defaultSearchField>
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<solrQueryParser defaultOperator="OR"/>
</schema>
- name:就是这个FieldType的名称。
- class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
fields节点内定义具体的字段(类似数据库的字段)
- name:字段名
- type:之前定义过的各种FieldType
- indexed:是否被索引
- stored:是否被存储(如果不需要存储相应字段值,尽量设为false)
- multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)
动态字段,没有具体名称的字段,用dynamicField字段
如:name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i, school_i
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
<dynamicField name="*_d" type="double" indexed="true" stored="true"/>
(3)solrconfig.xml
1、索引配置
- mergeFacor:决定Lucene段被合并的频率。较小的值(最小为2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。(典型的 时间与空间 的平衡配置)
- maxBufferedDocs:在合并内存中文档和创建新段之前,定义所需索引的最小文档数。段 是用来存储索引信息的Lucene文件。较大的值可使索引时间变快但会牺牲较多内存。
- maxMergeDocs:控制可由Solr合并的 Document 的最大数。较小的值(<10,000)最适合于具有大量更新的应用程序。
- maxFieldLength:对于给定的Document,控制可添加到Field的最大条目数,进而阶段该文档。如果文档可能会很大,就需要增加这个数值。然后,若将这个值设置得过高会导致内存不足错误。
2、查询处理配置
query标记段中以下一些与缓存无关的特性:
- maxBooleanClauses:定义可组合在一起形成以个查询的字句数量的上限。正常情况1024已经足够。如果应用程序大量使用了通配符或范围查询,增加这个限制将能避免当值超出时,抛出TooMangClausesException。
- enableLazyFieldLoading:如果应用程序只会检索Document上少数几个Field,那么可以将这个属性设置为true。懒散加载的一个常见场景大都发生在应用程序返回一些列搜索结果的时候,用户常常会单击其中的一个来查看存储在此索引中的原始文档。初始的现实常常只需要现实很短的一段信息。若是检索大型的Document,除非必需,否则就应该避免加载整个文档。
query中的智能缓存:
- filterCache:通过存储一个匹配给定查询的文档 id 的无序集,过滤器让 Solr 能够有效提高查询的性能。缓存这些过滤器意味着对Solr的重复调用可以导致结果集的快速查找。更常见的场景是缓存一个过滤器,然后再发起后续的精炼查询,这种查询能使用过滤器来限制要搜索的文档数。
- queryResultCache:为查询、排序条件和所请求文档的数量缓存文档 id 的有序集合。
- documentCache:缓存Lucene Document,使用内部Lucene文档id(以便不与Solr唯一id相混淆)。由于Lucene的内部Document id 可以因索引操作而更改,这种缓存不能自热。
- Named caches:命名缓存是用户定义的缓存,可被 Solr定制插件所使用。
其中filterCache、queryResultCache、Named caches(如果实现了org.apache.solr.search.CacheRegenerator)可以自热。
每个缓存声明都接受最多四个属性:
- class:是缓存实现的Java名。
- size:是最大的条目数。
- initialSize:是缓存的初始大小。
- autoWarmCount:是取自旧缓存以预热新缓存的条目数。如果条目很多,就意味着缓存的hit会更多,只不过需要花更长的预热时间。
对于所有缓存模式而言,在设置缓存参数时,都有必要在内存、cpu和磁盘访问之间进行均衡。统计信息管理页(管理员界面的Statistics)对于分析缓存的 hit-to-miss 比例以及微调缓存大小的统计数据都非常有用。而且,并非所有应用程序都会从缓存受益。实际上,一些应用程序反而会由于需要将某个永远也用不到的条目存储在缓存中这一额外步骤而受到影响。
(4)其他一些标签
<uniqueKey>id</uniqueKey>
文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。
<defaultSearchField>text</defaultSearchField>
如果搜索参数中没有指定具体的field,那么这是默认的域。
<solrQueryParserdefaultOperator="OR" />
配置搜索参数短语间的逻辑,可以是"AND|OR"。
https://www.jianshu.com/p/3bd54751265c
END