Solr基础

因为 Solr 包装并扩展了Lucene,所以它们使用很多相同的术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。在 Solr 和 Lucene 中,使用一个或多个 Document 来构建索引。Document包括一个或多个 Field。Field 包括名称、内容以及告诉 Solr 如何处理内容的元数据。

例如,Field 可以包含字符串、数字、布尔值或者日期,也可以包含你想添加的任何类型,只需用在solr的配置文件中进行相应的配置即可。Field 可以使用大量的选项来描述,这些选项告诉 Solr 在索引和搜索期间如何处理内容。

现在,查看一下表中列出的重要属性的子集:

  

属性名称

描述

Indexed

Indexed  Field 可以进行搜索和排序。你还可以在 indexed  Field 上运行 Solr 分析过程,此过程可修改内容以改进或更改结果。

Stored

stored  Field 内容保存在索引中。这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。

5.1 配置文件solr.xml

        

<?xml version="1.0"    encoding="UTF-8" ?>

<solr    persistent="false">

<cores adminPath="/admin/cores"    host="${host:}"

hostPort="${jetty.port:8983}"    hostContext="${hostContext:solr}">

<core name="core0" instanceDir="core0" />

<core name="core1" instanceDir="core1" />

</cores>

</solr>

这里没有配置defaultCoreName,默认为collection1。其中<cores>的adminPath属性指明通过浏览器查看主目录多个核的属性的相对地址。<core>是关于每个核的名字和目录的指示,例如,这里有两个核,core0和core1,它们各自的实例目录分别是solr.xml所在文件夹下的core0和core1目录。而且,就算没有solr.xml文件,也不会报错的,因为都有默认值。

源码片段如下:

        

public static final    String DEFAULT_DEFAULT_CORE_NAME = "collection1";

public static final    String DEF_SOLR_XML = "<?xml    version=\"1.0\" encoding=\"UTF-8\" ?>\n"

+ "<solr    persistent=\"false\">\n"

+ "  <cores    adminPath=\"/admin/cores\" defaultCoreName=\""

+ DEFAULT_DEFAULT_CORE_NAME

+ "\""

+ "    host=\"${host:}\" hostPort=\"${hostPort:}\"    hostContext=\"${hostContext:}\" zkClientTimeout=\"${zkClientTimeout:15000}\""

+ ">\n"

+ "    <core name=\""

+ DEFAULT_DEFAULT_CORE_NAME

+ "\"    shard=\"${shard:}\"    collection=\"${collection:collection1}\"    instanceDir=\"collection1\" />\n"

+ "  </cores>\n" +    "</solr>";

5.2 模式配置Schema.xml

schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。打开这个配置文件,会发现有详细的注释。模式组织主要分为三个重要配置

5.2.1.  types 部分

是一些常见的可重用定义,定义了 Solr(和 Lucene)如何处理 Field。也就是添加到索引中的xml文件属性中的类型,如int、text、date等.

        

<fieldType name="string"    class="solr.StrField" sortMissingLast="true"/>

<fieldType name="boolean"    class="solr.BoolField" sortMissingLast="true"/>

<fieldType name="int" class="solr.TrieIntField"    precisionStep="0" positionIncrementGap="0"/>

<fieldType name="text_general"    class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer    class="solr.StandardTokenizerFactory"/>

<filter    class="solr.StopFilterFactory" ignoreCase="true"    words="stopwords.txt" enablePositionIncrements="true"    />

<filter    class="solr.LowerCaseFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer    class="solr.StandardTokenizerFactory"/>

<filter    class="solr.StopFilterFactory" ignoreCase="true"    words="stopwords.txt" enablePositionIncrements="true"    />

<filter    class="solr.SynonymFilterFactory"    synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

<filter    class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

参数说明:

  

属性

描述


name


标识而已


class


和其他属性决定了这个fieldType的实际行为。


sortMissingLast


设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则, 默认是设置成false。


sortMissingFirst


跟上面倒过来,默认是设置成false


analyzer


字段类型指定的分词器


type


当前分词用用于的操作.index代表生成索引时使用的分词器query代码在查询时使用的分词器


tokenizer


分词器类


filter


分词后应用的过滤器  过滤器调用顺序和配置相同.

5.2.2.  fileds

是你添加到索引文件中出现的属性名称,而声明类型就需要用到上面的types

        

<field name="id"    type="string" indexed="true" stored="true"    required="true" multiValued="false"/>

<field name="path"    type="text_smartcn" indexed="false"    stored="true" multiValued="false" termVector="true"    />

<field name="content"    type="text_smartcn" indexed="false"    stored="true" multiValued="false"    termVector="true"/>

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

<field name ="pinyin" type    ="text_pinyin" indexed ="true" stored    ="false" multiValued ="false"/>

<field name="_version_"    type="long" indexed="true" stored="true"/>

<dynamicField name="*_i"    type="int" indexed="true" stored="true"/>

<dynamicField name="*_l"    type="long" indexed="true" stored="true"/>

<dynamicField name="*_s"    type="string" indexed="true" stored="true"    />

·      field: 固定的字段设置

·      dynamicField: 动态的字段设置,用于后期自定义字段,*号通配符.例如: test_i就是int类型的动态字段.

还有一个特殊的字段copyField,一般用于检索时用的字段这样就只对这一个字段进行索引分词就行了,copyField的dest字段如果有多个source一定要设置multiValued=true,否则会报错的。

另外,使用copyField将多个field都复制到一个总的field上,然后对它进行搜索,可以最小化索引字段并且提高搜索的效率。

        

<copyField source="content"    dest="pinyin"/>

<copyField source="content"    dest="text"/>

<copyField source="pinyin"    dest="text"/>

字段属性说明:

  

属性

描述


name


字段类型名


class


java类名


indexed


缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。


stored


缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。


omitNorms


字段的长度不影响得分和在索引时不做boost时,设置它为true。

一般文本字段不设置为true。


termVectors


如果字段被用来做more like this 和highlight的特性时应设置为true。


compressed


字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。


multiValued


字段多于一个值的时候,可设置为true。


positionIncrementGap


和multiValued一起使用,设置多个值之间的虚拟空白的数量

注意:_version_ 是一个特殊字段,不能删除,是记录当前索引版本号的.

5.2.3. 其他配置

uniqueKey: 唯一键,这里配置的是上面出现的fileds,一般是id、url等不重复的。在更新、删除的时候可以用到。

defaultSearchField:默认搜索属性,如q=solr就是默认的搜索那个字段

solrQueryParser:查询转换模式,是并且还是或者(AND/OR必须大写)

5.3. solr配置solrconfig.xml

solrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置。下面详细说明:

5.3.1 索引indexConfig

Solr性能因素,来了解与各种更改相关的性能权衡。 下表概括了可控制 Solr 索引处理的各种因素:

  

属性

描述

useCompoundFile

通过将很多 Lucene 内部文件整合到一个文件来减少使用中的文件的数量。这可有助于减少 Solr 使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄,否则 false 的默认值应该就已经足够。

ramBufferSizeMB

在添加或删除文档时,为了减少频繁的更些索引,Solr会选缓存在内存中,当内存中的文件大于设置的值,才会更新到索引库(也就是<maxBufferedDocs>制定缓存的文档数目达到多少时会自动建立硬盘索引文件)。较大的值可使索引时间变快但会牺牲较多的内存。如两个值同时设置,满足一个就会进行刷新索引

maxBufferedDocs

mergeFactor

决定低水平的 Lucene 段被合并的频率。较小的值(最小为 2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。例如:<meigeFactor>10</mergeFactor>表示,最低级的索引文件数量达到10时会合并为1个索引文件,当这样合成索引文件数目达到10个时,又会合并为更高级的索引文件

maxIndexingThreads

indexWriter生成索引时使用的最大线程数

unlockOnStartup

unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为 true 可以禁用启动锁定,进而允许进行添加和更新。

lockType

single: 在只读索引或是没有其它进程修改索引时使用.

native: 使用操作系统本地文件锁,不能使用多个Solr在同一个JVM中共享一个索引.

simple :使用一个文本文件锁定索引.

5.3.2 查询配置query

  

属性

描述

maxBooleanClauses

最大的BooleanQuery数量. 当值超出时,抛出 TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的.

filterCache

filterCache存储了无序的lucene document id集合,存储了filter queries(“fq”参数)得到的document id集合结果,还可用于facet,如果配置了useFilterForSortedQuery,那么如果查询有filter,则使用filterCache

queryResultCache

缓存搜索结果,一个文档ID列表

documentCache

缓存Lucene的Document对象,不会自热

fieldValueCache

字段缓存使用文档ID进行快速访问。默认情况下创建fieldValueCache即使这里没有配置。

enableLazyFieldLoading

若应用程序预期只会检索 Document 上少数几个 Field,那么可以将属性设置为 true。延迟加载的一个常见场景大都发生在应用程序返回和显示一系列搜索结果的时候,用户常常会单击其中的一个来查看存储在此索引中的原始文档。初始的显示常常只需要显示很短的一段信息。若考虑到检索大型 Document 的代价,除非必需,否则就应该避免加载整个文档。

queryResultWindowSize

一次查询中存储最多的doc的id数目.

queryResultMaxDocsCached

查询结果doc的最大缓存数量, 例如要求每页显示10条,这里设置是20条,也就是说缓存里总会给你多出10条的数据.让你点示下一页时很快拿到数据.

listener

选项定义 newSearcher 和 firstSearcher 事件,您可以使用这些事件来指定实例化新搜索程序或第一个搜索程序时应该执行哪些查询。如果应用程序期望请求某些特定的查询,那么在创建新搜索程序或第一个搜索程序时就应该反注释这些部分并执行适当的查询。

useColdSearcher

是否使用冷搜索, 为false时使用“预热”后的searcher

maxWarmingSearchers

最大“预热”searcher数量

5.3.3 <dataDir>

用于替换默认的索引数据目录(./data),如果不是绝对路径,将使用servlet容器当前工作目录下的相对路径。

5.3.4 更新处理器的配置<updateHandler>

该元素用于对更新处理器进行配置,更新处理器是用于更新索引数据的类,主要涉及底层的关于如何更新处理内部的信息。(不要跟高层次的配置参数Request Handlers对处理发自客户端的更新相混淆)

常用配置参数:

        

<updateHandler    class="solr.DirectUpdateHandler2">

<autoCommit>

<maxDocs>10000</maxDocs>

<maxTime>1000</maxTime>

</autoCommit>

<listener    event="postCommit"    class="solr.RunExecutableListener">

<str name="exe">snapshooter</str>

<str name="dir">solr/bin</str>

<bool name="wait">true</bool>

<arr name="args"> <str>arg1</str>    <str>arg2</str> </arr>

<arr name="env"> <str>MYVAR=val1</str>    </arr>

</listener>

</updateHandler>

参数说明:

  

属性

描述


class


使用哪个类进行索引更新操作


autoCommit


在何时对索引数据进行提交(就是将内存中的索引写到硬盘)。上面的配置参数指明在内存中缓存的文档数目达到10000或时间达到1000时进行提交。


listener


配置一个“监听器”,这个“监听器”在特定的事件发生时将被触发

5.3.5 <requestDispatcher>

这里配置可以被HTTP的requestDispatcher使用的一些参数。

5.3.6 <requestHandler>

可以定义多个请求处理器,这些处理器可以在查询和索引数据更新的时候使用。

5.3.7 <queryResponseWriter>

可以定义多个结果处理器,这些结果处理器会以不同的方式返回结果。

5.4Solr加入中文分词器

中文分词在solr里面是没有默认开启的,需要我们自己配置一个中文分词器。目前可用的分词器有smartcn,IK,Jeasy,庖丁。其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn,ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK ,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。各有优缺点看应用场合自己衡量选择吧。

下面给出两种分词器的安装方法,任选其一即可,推荐第一种,因为smartcn就在solr发行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.7.0.jar,首选在solrconfig.xml中加一句引用analysis-extras的配置,这样我们自己加入的分词器才会引用到solr中.

        

<lib    dir="../../../contrib/analysis-extras/lib"    regex=".*\.jar" />

5.4.1.  smartcn 分词器的安装

首选将发行包的contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-4.7.0.jar复制到\solr\contrib\analysis-extras\lib下,在solr本地应用文件夹下,打开/solr/conf/scheme.xml,编辑text字段类型如下,添加以下代码到scheme.xml中的相应位置,就是找到fieldType定义的那一段,在下面多添加这一段就好啦

        

<fieldType name="text_smartcn"    class="solr.TextField" positionIncrementGap="0">

<analyzer type="index">

<tokenizer    class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter    class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer    class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

</analyzer>

</fieldType>

如果需要检索某个字段,还需要在scheme.xml下面的field中,添加指定的字段,用text_smartcn作为type的名字,来完成中文分词。如 text要实现中文检索的话,就要做如下的配置:

        

<field name ="text" type    ="text_smartcn" indexed ="true" stored    ="false" multiValued ="true"/>

5.4.2.  IK 分词器的安装

首选要去下载IKAnalyzer的发行包.下载地址: http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.

下载后解压出来文件中的三个复制到\solr\contrib\analysis-extras\lib目录中.

IKAnalyzer2012FF_u1.jar       分词器jar包

IKAnalyzer.cfg.xml                 分词器配置文件

Stopword.dic                           分词器停词字典,可自定义添加内容

复制后就可以像smartcn一样的进行配置scheme.xml了.

        

<fieldType name="text_ik"    class="solr.TextField">

<analyzer    class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

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

现在来验证下是否添加成功,首先使用StartSolrJetty来启动solr服务,启动过程中如果配置出错,一般有两个原因:一是配置的分词器jar找不到,也就是你没有复制jar包到\solr\contrib\analysis-extras\lib目前下;二是分词器版本不对导致的分词器接口API不一样出的错,要是这个错的话就在检查分词器的相关文档,看一下支持的版本是否一样.

如果在启动过程中没有报错的话说明配置成功了.我们可以进入到http://localhost:8080/solr地址进行测试一下刚加入的中文分词器.在首页的Core Selector中选择你配置的Croe后点击下面的Analysis,在AnalyseFieldname / FieldType里选择你刚才设置的字段名称或是分词器类型,在Field Value(index)中输入:中国人,点击右面的分词就行了.

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2024-10-13 07:43:48

Solr基础的相关文章

【Solr基础教程之一】Solr快速入门

一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr的基础使用. (2)API:http://lucene.apache.org/solr/4_9_0/index.html (3)reference:PDF格式,apache-solr-ref-guide-4.9.pdf 2.书籍 (1)Solr in Action,基于4.7版本,极力推荐,此书适合

Solr学习之二-Solr基础知识

一 基本说明 简单来说Solr是基于Lucene的高性能的,开源的Java企业搜索服务器.Solr可以看作一个Web app,运行在tomcat或Jetty这类HTTP服务器上, 底层是一个基于Lucene的搜索引擎,还附加一个Solr的基本管理界面.Solr提供HTTP服务,通过Get方法进行查询,通过Post方法进行索引的添加/删除管理. 一般来说Solr的查询时通过Get方法请求到HTTP服务器的solr这个app下的/select对应的servlet上去,而添加等操作时通过POST方法到

【solr基础教程之中的一个】Solr相关知识点串讲

Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一个完整的搜索引擎.它能够为搜索引擎加入文档.对文档内容进行分析,并为用户提供搜索功能,在此基础上提供了一个扩展功能,如hit highline, suggetion等. 一.概述 (一)基础内容 1.Solr的版本与Lucene的版本保持一直,直到2014年7月,最新版本为4.9.0. 2.Solr提供了一个ex

【Solr基础教程之X】配置文件:Solr.xml SolrConfig.xml Schema.xml

1.关于默认搜索域 If you are using the Lucene query parser, queries that don't specify a field name will use the defaultSearchField. The DisMax and Extended DisMax query parsers do not use this value. Use of the defaultSearchField element is deprecated in So

Solr基础教程之环境搭建(一)

一.开篇一点概念 最近想深入研究下solr,顺便记录一些知识点,以供后来者. 1.Solr是什么东西 Solr是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式). 它易于安装和配置,而且附带了一个基于HTTP 的管理界面. 2.Solr的特性包括 高级的全文搜索功能 专为高通量的网络流量进行的优化 基于开放接口(XML和HTTP)的标准 综

【solr基础教程之九】client

一.Java Script 1.因为Solr本身能够返回Json格式的结果,而JavaScript对于处理Json数据具有天然的优势,因此使用JavaScript实现Solrclient是一个非常好的选择. 2.在之前,主要使用SolJS作为solr的client,眼下主要使用ajax-solr,信息请见:https://github.com/evolvingweb/ajax-solr/wiki/Reuters-tutorial%3A-step-1. 3.下面演示样例未使用上述所述的client

Solr基础教程之solrconfig.xml(三)

前面介绍过schema.xml的一些配置信息,本章介绍solrconfig.xml的配置,以及怎样安装smartcn分词器和IK分词器,并介绍主要的查询语法. 1. solr配置solrconfig.xml solrconfig.xml这个配置文件能够在你下载solr包的安装解压文件夹的D:\solr-4.10.4\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包括依赖的jar和Solr的一些插件;组件信息配置;索引配置和

solr基础知识简介

1.1 solr简介 ApacheSolr作为搜索服务器,实现站内搜索具有封装性好和良好的扩展性,多门户社区多采用solr进行搜索引擎的建设.ApacheSolr 是一个开源的搜索服务器,Solr使用 Java语言开发,主要基于 HTTP 和Apache Lucene 实现. 1.2 solr实现原理 Solr对外提供标准的http接口来实现对数据的索引的增加.删除.修改.查询.在Solr中,用户通过向部署在servlet 容器中的Solr Web应用程序发送 HTTP 请求来启动索引和搜索.S

Solr学习01:Solr基础知识

一.什么是solr 首先,要了解下Solr是什么,以下是官方的描述. Solr是一个来自Apache Lucence项目,是一个热门开源的企业级搜索平台.为目前世界上相当多的大型互联网站点提供搜索和导航服务. [http://wiki.apache.org/solr/] Solr使用Java语言写的,作为一个独立的全文检索服务器项目,可运行在如Jetty或Tomcat等servlet容器中.(Solr提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等