Apache Solr7.4 入门教程

由于最近公司业务可能需要用到solr所以花了几天时间研究了一下,发现solr在网上的教程没有太好的入门文章,要么文章所写的solr版本太老,要么就是介绍的内容不够完整。所有我打算写一篇有完整使用流程的solr教程希望能让后面新接触solr的同学能更容易掌握它,另一方面也是对自己所学做一个梳理。由于本人水平有限如果有书写不对的地方还请多多指正,万分感谢。

一、 Apache Solr 简介

Apache Solr 是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr 4还增加了NoSQL支持,还支持REST风格API。支持强大的匹配能力,如短语,通配符,连接,分组和更多不同的数据类型。它使用 Apache Zookeeper特别针对高流量进行优化。Apache Solr提供各式各样的功能,我们列出了部分最主要的功能。

  1. 先进的全文搜索功能。
  2. XML,JSON和HTTP - 基于开放接口标准。
  3. 高度可扩展和容错。
  4. 同时支持模式和无模式配置。
  5. 分页搜索和过滤。
  6. 支持像英语,德语,中国,日本,法国和许多主要语言
  7. 丰富的文档分析。

Solr是用Java编写、运行在Servlet容器(如Apache Tomcat或Jetty)的一个独立的全文搜索服务器。 Solr采用了Lucene Java搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。 Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。

因为2010年Apache Lucene和Apache Solr项目合并,两个项目是由同一个Apache软件基金会开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。

二、下载与安装

1、 安装jdk 1.8 环境

solr是java开发的,运行要有java环境。由于Apache Solr 是自带web容器Jetty服务器,所以不需要安装其他web容器。

2、下载 Solr

Apache Solr 官网下载

3、安装 Solr

下载完成后会得到一个压缩包,解压后会获得一个solr-7.4.0文件夹,此文件夹目录结构如下图
solr目录

文件夹 说明
bin solr的运行脚本
contrib Solr的一些扩展jar包,包括分词器,聚类,语言识别,数据导入处理,非结构化内容分析等.
└─ analysis-extras 包含一些文本分析组件及其依赖
├─ clustering 包含一个用于集群搜索结果的引擎
├─ dataimporthandler
├─ dataimporthandler-extras 把数据从数据库或其它数据源导入到solr
├─ extraction 整合了Apache Tika。Tika是用于解析一些富文本(诸如Word,PDF)的框架
├─ langid 检测将要索引的数据的语言
├─ ltr
├─ prometheus-exporter 日志的输出
├─ uima 包含用于整合Apache UIMA(文本元数据提取的框架)类库
└─ velocity 包含基于Velocity模板的简单的搜索UI框架
dist 该目录包含运行solr的jar文件,以及相关的依赖jar文件
docs solr 的API文档
example solr 示例程序
licenses solr用到的一些证书
server solr 核心文件夹
└─ contexts Solr运行于Jetty下时的配置文件
├─ etc Jetty的配置
├─ lib 关于Jetty与metrics的依赖
├─ logs 日志文件
├─ modules
├─ resources Log4j的配置文件
├─ scripts scripts
├─ solr 所有构建的 索引库
├─ configsets 示例配置文件
└─ solr-webapp Jetty发布的解压war后的文件
start.jar solr 启动程序

三、运行solr

Solr的运行分为单机运行和集群运行,这里以单机为例:
在bin目录下执行 solr start -p 8888

start

如图这句提示出现后证明服务启动成功(启动过程中如果打印java异常堆栈log4j2.xml 文件名、目录名或卷标语法不正确。没有关系不妨碍我们正常使用solr可以忽略此问题),接下来在浏览器输入http://localhost:8888/solr可以进入Admin UI界面验证是否启动成功如下图

dashboard

solr常用命令:
solr start –p <端口号> 单机版启动solr服务
solr restart –p <端口号> 重启solr服务
solr stop –p <端口号> 关闭solr服务
solr create –c <name> 创建一个core实例

此外有关于solr集群版启动方式和其他更多的命令可以参看官方文档

四、创建core实例

1. core简介

简单说core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和与之相应的配置文件,所以在操作solr创建索引之前要创建一个core,因为索引都存在core下面。

2. core创建

core的创建方式,我列出两种比较方便的。
(1). 以管理进入cmd, 在$SOLR_HOME/bin目录下执行solr create –c <name>,创建一个core

create

执行完后,会在$SOLR_HOME/server/solr 下创建一个 eden_core文件夹。
(2).在AdminUI页面创建一个core。
add

这种需要你提前,准备好 $索引库名/conf/solrconfig.xml$索引库名/conf/lang/下的一些文件,不然会报如下一系列错误,
error1
error2

所以,我们需要从$SOLR_HOME/solr/configsets/sample_techproducts_configs/conf/ 下拷贝以下文件:

  1. lang/ 下所有文件
  2. managed-schema
  3. solrconfig.xml
  4. synonyms.txt
  5. stopwords.txt
  6. protwords.txt
  7. params.json

五、managed-schema(schema.xml)

1. schema简介:

schema是用来告诉solr如何建立索引的,他的配置围绕着一个schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,老版本的schema配置文件的名字叫做schema.xml他的配置方式就是手工编辑,但是现在新版本的schema配置文件的名字叫做managed-schema,他的配置方式不再是用手工编辑而是使用schemaAPI来配置,官方给出的解释是使用schemaAPI修改managed-schema内容后不需要重新加载core或者重启solr更适合在生产环境下维护,如果使用手工编辑的方式更改配置不进行重加载core有可能会造成配置丢失,配置文件所在的路径如下:
$SOLR_HOME/server/solr/eden_core/conf/managed-schema
config

2. schema 主要成员

<schema>
    <field/>
    <dynamicField/>
    <uniqueKey/>
    <fieldType>
        <analyzer>
            <tokenizer/>
            <filter/>
        </analyzer>
    </fieldType/>
    <copyField/>
    <dynamicField>
</schema>
2.1 field
属性 默认值 说明
name 必须,不能取名score,前后辍为下划线的名字(如:_VERSION_)为保留名字
type 必须,值为定义的<fieldType>
indexed true 是否进行索引。 true的时候进行索引
stored true 是否存储。如果此字段的值需要显示在搜索结果中,则需要进行存储。
docValues false 是否需要存储docValues。true为设置。docValues用于提升sorting, faceting, grouping, function queries等性能,现在仅支持StrField, UUIDFiel和所有的Trie*Field,此值为true的字段要求此字段multiValued=false,并且 (required=true或设置了default的值).
multiValued false 是否有多个值
omitNorms 如果你的大部分的document的长度大小都差不多,则设置成true。如果此字段在索引时需要boost,则设置为false.
termVectors false 设置为true,使More Like This特性生效,会极大的增加索引文件的大小
termPositions false 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小
termOffsets fasle 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小
termPayloads fasle 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小
required fasle 如果设置为true,则索引时,如果此字段值为null,则会报错
default 此字段是默认字段
sortMissingFirst
sortMissingLast
false 需要对搜索结果根据某个字段排序时,如果某条记录的此字段值为空,则该记录是排在搜索结果的最前/最后
omitTermFreqAndPositions 对所有不是文本类型的字段,默认为TRUE
omitPositions 与omitTermFreqAndPositions相似,只是仅忽略位置信息
useDocValuesAsStored 当docValues=true时,设置此值为TRUE,则如果返回的字段列表使用了通配符,即使此字段设置了stored=false,此字段还是会出现在返回的结果里,
large false 设置为TRUE时,需要设置stored=true和multiValued=false, 表示此字段是大字段,会被懒加载。通常用于此字段的内容可能比较大,不需要载入内存

说明:

omitNorms:
norm是基于document length norm,document boost和field boost计算出的浮点(float)值。这里的boost可以理解为权重。document length norm用于为较小的document增加权重(权重较大的话,计算搜索结果的score值会更高一点)。也就是说如果有一个比较小的document和一个比较长的document都符合搜索条件,Lucene会认为那个较小的document相对于较长的document更新符合搜索条件。omitNorms是指忽略norm,所以设为false时,较小的document和较长的document有相同的权重。因此如果我们需要为某个字段在索引时进行加权(boost),则应该设置为false。当字段类型为基本类型(比如:int, float,date,bool. string)时此默认值是true。
termVectors, termPositions, termOffsets 和 termPayloads:
此四个属性通常用于 hl.useFastVectorHighlighter为true时的情况,会较大地增加索引大小。
omitTermFreqAndPositions:
如果为TRUE,索引时将忽略频率、位置、负载等信息,这有助于提升不需要这些信息的字段的性能,也会减少索引大小。但是查询如果依赖于字段的位置信息,则会导致查询不到相关document。

2.2 dynamicField

为满足前辍或后辍的一些字段提供统一的定义。如<dynamicField name="*_s" index="true" stored="true" type="string" /> 表示所有以“_s”为后辍的field都具有index="true" stored="true" type="string"这些属性。dynamicField通常用于以下情形:

2.2.1 document模型具有较多的字段

举个粟子:想要索引pdf文件,Solr提供了一个简单的requestHandler – /update/extract,最终会调用apache的另外一个开源项目Tika去解析pdf文件,Solr返回的解析后的document里包含了很多field,我们只想要其中的某些field,如果我们在<field>里只配置了我们想要的field,那么进行索引的时候会报错,错误消息大体为没有定义什么什么field,这时,我们可以配置一个<dynamicField name="ignore_*" type="ignored" multiValued="true">,然后在solrconfig.xml里相应的requestHandler里配置<str name="uprefix">ignore_</str>,这样对于在managed-schema里没定义的field都会被忽略掉。

2.2.2 支持来自不同来源的文档

比如索引的时候想要增加标注其来源的field,可以进行如下的配置:

<field name="source1_field1" type="string" index="true" stored="true" />
<field name="source1_field2" type="string" index="true" stored="true" />
<field name="source1_field3" type="string" index="true" stored="true" />

               

<field name="source2_field1" type="string" index="true" stored="true" />
<field name="source2_field2" type="string" index="true" stored="true" />
<field name="source2_field3" type="string" index="true" stored="true" />

但是如果有很多来源的话,这种配置就太多了。我们只须配置<dynamicField name="*_s" index="true" stored="true" type="string" />,然后索引的时候改成:

<doc>
    <field name="id">hello</field>
    <field name="source1_field1_s">hello</field>
</doc>

这样,索引时的field名既可以保留来源的信息,又不需要在配置文件里配置很多的field定义。

2.2.3 增加新的文档来源

还是上面的例子,如果将来有新的文档来源,我们可以不必在配置文件里增加诸如 <field name="source5_field1" type="string" index="true" stored="true" />这样的配置,就可以直接在索引的时候添加“source5_field1_s”这样的字段。

2.3 uniqueKey

一般情况下需要配置<uniqueKey>id</uniqueKey>,虽然目录不是必须的,但是强烈建议设置此值。就好像数据库设计时,虽然不强制每个表有主键,但是一般情况下还是会设置一个主键的。

2.4 copyField

用百度或google搜索时,我们可能想要搜索一个人名,或者书名,或者网站的名字,其后台索引文件里分别由不同的field去保存那些值,那它是如何用一个输入框去搜索不同的field的内容的呢?答案就是<copyField> (不知道百度或google用的是什么搜索技术,但是原理应该差不多)

<field name="text" type="string" index="true" stored="true" multiValues="true" />
<copyField source="man_name" dest="text" />
<copyField source="book_name" dest="text" />
<copyField source="web_address" dest="text" />

这样我们就只需要搜索text里的内容就可以了。

2.5 fieldType

fieldType主要定义了一些字段类型,其name属性值用于前面中的type属性的值。e.g. <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 其中class属性中solrorg.apache.solr.schema这个包名的缩写。
fieldType的属性:
1)name 由字母、数字和下划线组成。不能以数字开头。此值用于前面中的type属性的值。
2)class 此值表明索引并存储此fieldType的数据的类型(e.g char,int,date…)。如果此类不是solr提供的(自定义的或第三方的类),则不能用”solr.”,需要写类的全路径名。
3)positionIncrementGap 值为整数,用于multiValued=”true”的字段,指定多个值之间的距离,以防出现假的短语匹配。
比如描述书本作者的字段是有多个值的,假设有两个作者:John Smith 和 Mike Jackson,我们搜索”Smith Mike”这个作者,如果positionIncrementGap值设成0,则此记录就会被认为是匹配搜索条件的,实际上是不匹配的。对于这种情况,我们应该把此值设置成一个较大的值,比如100。
4) autoGeneratePhaseQueries 值为布尔类型。默认值为false。对于文本字段,如果设置为TRUE的话,Solr自动为相邻的terms生成短语查询。如果为FALSE,包含在双引号内的terms才会被认为是短语。
举个粟子:索引中的文本内容为: * 日图三餐,夜图一宿 。 我们在搜索的输入框里输入日图,如果autoGeneratePhaseQueriestrue,我们加上highlight的话,返回的匹配结果为: 日图三餐,夜图一宿 *。 如果值为false,则返回结果为 日图三餐,夜一宿。如果值为false,我们还是想要进行短语查询,可在输入框里输入”春花”(注意需要加上两个双引号)。
5)docValuesFormat 自定义docValues的格式。设置此值的话,必须在solrconfig.xml里配置schema-aware codec。如:<codecFactory class="solr.SchemaCodecFactory" /> 在网上搜了一下,只看到有两个值 Memory 和 Disk。猜想这个属性的作用应该是定义docValues值是存在硬盘上还是存在内存中吧。
6)postingsFormat 自定义PostingsFormat。设置此值的话,必须在solrconfig.xml里配置schema-aware codec。不太清楚具体有什么用。
注:尽量不要使用docValuesFormat和postingFormat。Solr的guideline上有一段话,翻译如下:

仅当使用默认的codec 时,Lucene索引才支持向后兼容。因此,如果使用了这两个属性,那么将来想要升级到更高版本的Solr 时,需要你切换回默认的codec,然后优化现有的索引或者重新建立整个索引。

以下的属性也同时存在于<field>里,如果<field>里的值会覆盖<fieldType>里的值。
7)indexed 布尔值。true表示进行索引。
8)stored 布尔值。true表示进行存储。
9)docValues 布尔值。true表示field的值将会被存储于面向列的数据结构中。
10)sortMissingFirst 布尔值。true表示排序的时候,此field值为空的记录排在此field值不为空的记录的前面。
11)sortMissingLast 布尔值 。意思和sortMissingFirst相反。
12)multiValues 布尔值。
13)omitNorms 布尔值。
14)omitTermFreqAndPositions 布尔值。忽略term frequency, positions 和 payloads。所有非文本类型字段,此默认值是true。
15)omitPositions 布尔值。布尔值。忽略positions。
16)termVectors, termPositions, termOffsets 和 termPayloads 布尔值。
17)required 布尔值。
18)useDocValuesAsStored 布尔值。
19)large 布尔值。默认FALSE
fieldType里class属性的一些值:
1)BinaryField 二进制数据
2)BoolField 布尔值数据。以”1”、”T”和”t”开头的字符都被认为是true,其它都是false
3)CollationField 参见 CollationField
4)CurrencyField 支持货币及汇率。
5)DateRangeField 日期
6)ExternalFileField 从硬盘上的某个文件获取值
7)EnumField 允许定义一组枚举值,用于对不能根据字母或数值排序的字段进行排序。
<fieldType name="priorityLevel" class="solr.EnumField" enumsConfig="enumsConfig.xml" enumName="priority" />
enumsConfig的值是枚举值的配置文件。enumsConfig.xml 示例:

<?xml version="1.0" ?>
<enumsConfig>
    <enum name="priority"><!-- 上面<fieldType> 里的enumName的值 -->
        <value>Low</value>
        <value>Medium</value>
        <value>High</value>
    </enum>
    <enum name="risk"> ... 其它一些枚举名及其值列表  ...</enum>
</enumsConfig>

8)ICUCollationField 参见 ICUCollationField
9)LatLonPointSpatialField 经纬度。用于空间搜索。通常表示为”lat,lon”
10)PointType 单值多维度点值。个人理解是指坐标值,比如二维或二维坐标。
11)PreAnalyzedField 参见 PreAnalyzedField
12)RandomSortField 不包含值。在此类型的字段上排序,将会返回随机的排序结果。
13)SpatialRecursivePrefixTreeFieldType 接受”latitue,logitude”格式的字符串或WKT格式。完全不明白是啥。
14)StrField UTF-8或Unicode的字符串。用于较小的字段,并且不被切分或分析(个人理解:此字段的值不会被拆分,被做为一个整体进行索引)。限制小于32K
15)TextField
16)TrieDateField, TrieDoubleField, TrieFloatField, TrieIntField, TrieLongField 见下面的说明
17)DatePointField, DoublePointField, FloatPointField, IntPointField, LongPointField 见下面的说明
18)UUIDField 定义一个document的唯一值。官方文档提到在SolrCloud环境下,不能保证唯一性,不建议使用,推荐使用UUIDUpdateProcessorFactory去生成UUID。
另外,在solr给的sample文件里,对于数值类型,定义了如下三个fieldType(以int为例):
a). <fieldType name="pint" class="solr.IntPointField" docValues="true" />
b). <fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
c). <fieldType name="tint" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
对于a),对于数值类型的field,索引时使用KD-trees。 sample文件里提到要比 Trie*Field更快更高效,但是不支持某些特性。并未说明不支持哪些特性,所以并不推荐使用
对于b),通常用于确定性搜索,比如要搜索年龄是18的人。
对于c),用于范围搜索,比如要搜索某个年龄段的人。

也就是说,我们如果要对某项数据(比如人的信息,其中包含年龄字段)进行索引,一个人有唯一的年龄值,但是我们搜索的时候,可能需要进行确定年龄的搜索和年龄段的搜索,那么我们就需要定义两个年龄相关的field,其中一个field的fieldType为int,另一个field的fieldType为tint。

对 precisionStep 的一些说明:

比如 单个车的价格是不一样的,我们通常会查询某个价格范围内的车子信息。假设所有车辆价格范围是1万~1000万,为了加快查询速度,会把这个价格区间划分为几个区间进行索引。precisionStep的值差不就是划分为多少个区间的意思。

2.5.1Analyzer

有些时候,我们需要自定义 fieldType。下面的例子就是自定义的 fieldType,<analyzer type="index"> 表示索引时怎么处理,<analyzer type="query">表示查询时怎么处理。
复制代码

<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" />
        <!-- 本例中,我们只在查询时应用同义词
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

tokenizer: 对输入流进行分词。这里的“solr.” 代表:org.apache.solr.analysis. 这个包
filter: 对tokenizer输出的每一个分词,进行处理。

2.5.2 Tokenizer

2.5.2.1. solr.StandardTokenizerFactory
把文本用空格和标点符号分割。对于小数点(.),如果后面不是空格的话,将会被保留。如网址。连字符(-)的两边会被分割成两个分词(token)。
参数:maxTokenLength 分词的最大长度,超出部分将被忽略。
example:

<analyzer>
    <tokenizer class="solr.StandardTokenizerFactory" maxTokenLength="100"/>
</analyzer>

输入: Please email [email protected] by 03-09, re: m37-xq.
输出: “Please”, “email”, “john.doe”, “foo.com”, “by”, “03”, “09”, “re”, “m37”, “xq”
2.5.2.2. solr.ClassicTokenizerFactory
跟StardardTokenizerFactory差不多,不同点如下:
(1)连字符(-)两边如果有数字的话,将不会被拆分。
(2)能识别邮件地址
参数:maxTokenLength 分词的最大长度,超出部分将被忽略。
示例:
输入: Please email [email protected] by 03-09, re: m37-xq.
输出: “Please”, “email”, “[email protected]“, “by”, “03-09”, “re”, “m37-xq”
2.5.2.3. solr.KeywordTokenizerFactory
整个文本做为一个分词。
示例:
输入: Please email [email protected] by 03-09, re: m37-xq.
输出: “Please email [email protected] by 03-09, re: m37-xq”
2.5.2.4. solr.LetterTokenizerFactory
连续的字母做为一个分词。
示例:
输入: I can’t.
输出: “I”, “can”, “t”
2.5.2.5. solr.LowerCaseTokenizerFactory
按非字母进行分词,并转化成小写。
示例:
输入: I LOVE my iPhone.
输出: “I”, “love”, “my”, “iphone”
2.5.2.6. solr.NGramTokenizerFactory
对文本按照 n-Gram 进行分词。
参数:minGramSize (default 1) – 必须 > 0
maxGramSize (default 2) – 必须 >= minGramSize
示例:
输入: hey man
输出: “h”, “e”, “y”, ” “, “m”, “a”, “n”, “he”, “ey”, “y “, ” m”, “ma”, “an”
2.5.2.7. solr.EdgeNGramTokenizerFactory
对文本按照 n-Gram 进行分词。
参数:minGramSize (default 1) – 必须 > 0
maxGramSize (default 1) – 必须 >= minGramSize
side (default “front”) – “front” or “back”
示例:
输入: babaloo
输出(default): “b”
输出(minGramSize=2, maxGramSize=5):”ba”, “bab”, “baba”, “babal”
2.5.2.8. solr.ICUTokenizerFactory
对多语言文本,基于其语言特性,进行恰当地分词。
参数:rulefile– 此值的格式: 四个字母的语言代码+“:”+文件路径

<analyzer>
    <tokenizer class="solr.ICUTokenizerFactory" rulefile="Latn:my.Latin.rule.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>

注意:需要添加额外的jar包到Solr 的 classpath下。
2.5.2.9. solr.PathHierarchyTokenizerFactory
用replace指定的字符代替delimiter指定的字符,并进行分词
参数:delimiter (no default)
replace (no default)
示例:

<analyzer>
    <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>

输入: d:\usr\local\apache
输出: “d:”, “d:/usr”, “d:/usr/local”, “d:/usr/local/apache”
2.5.2.10. solr.PatternTokenizerFactory
利用Java的正则表达式进行分词。
参数:pattern – 必填
group – 可选。默认 -1 。
-1 表示正则表达式作为分割符。0 表示符合正则表达式的才会被认为是一个分词而保留。大于0的值(比如2)表示只保留符合正则表达式的部分中的第2个部分。
示例:

<analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*\s*" />
</analyzer>

输入: fee,fie, foe , fun, foo
输出: “fee”, “fie”, “foe”, “fun”, “foo”
示例:

<analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>

输入: Hello, My name is Rose.
输出: “Hello”, “My”, “Rose”
2.5.2.11. solr.UAX29URLEmailTokenizerFactory
空格和标点符号做为分割符。小数点如果后面不是空格,则被保留。连接符(“-”)连起来的各个部分将被划分为独立的分词,除非其中包含数字。网址、Email、IP地址将会被认为一个整体。
参数:maxTokenLength – 长度超过此值的分词将会被截断。
2.5.2.12. solr.WhitespaceTokenizerFactory
仅将空格做为分割符。
参数:rule – “java”: 默认值,利用Character.isWhitespace(int)确定是否是whitespace。 “unicode”: 利用Unicode的whitespace做为分割符。

2.5.3 filter

自定义fieldType时,通常还会用到filter。filter必须跟在tokenizer或其它filter之后。如:

<fieldType>
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>

Solr 提供了很多的filter,具体如下:
1. ASCII Folding Filter
2. Beider-Morse Filter
3. Classic Filter
4. Common Grams Filter
5. Collation Key Filter
6. Daitch-Mokotoff Soundex Filter
7. Double Metaphone Filter
8. Edge N-Gram Filter
9. English Minimal Stem Filter
10. English Possessive Filter
11. Fingerprint Filter
12. Flatten Graph Filter
13. Hunspell Stem Filter
14. Hyphenated Words Filter
15. ICU Folding Filter
16. ICU Normalizer 2 Filter
17. ICU Transform Filter
18. Keep Word Filter
19. KStem Filter
20. Length Filter
21. Limit Token Count Filter
22. Limit Token Offset Filter
23. Limit Token Position Filter
24. Lower Case Filter
25. Managed Stop Filter
26. Managed Synonym Filter
27. N-Gram Filter
28. Numeric Payload Token Filter
29. Pattern Replace Filter
30. Phonetic Filter
31. Porter Stem Filter
32. Remove Duplicated Token Filter
33. Reversed Wildcard Filter
34. Shingle Filter
35. Snowball Porter Stemmer Filter
36. Standard Filter
37. Stop Filter
38. Suggest Stop Filter
39. Synonym Filter
40. Synonym Graph Filter
41. Token Offset Payload Filter
42. Trim Filter
43. Type As Payload Filter
44. Type Token Filter
45. Word Delimiter Filter
46. Word Delimiter Graph Filter

2.6. defaultSearchField

defaultSearchField指定搜索的时候默认搜索字段的值。

2.7. solrQueryParser

solrQueryParser指定搜索时多个词之间的关系,可以是or,and两种。

2.8. 性能优化

1、 将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false;
2、 将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false;
3、 删除所有不必要的copyField声明为了索引字段的最小化和搜索的效率;
4、 将所有的 text fields的index都设置成false,然后使用copyField将他们都复制到一个总的 text field上,然后进行搜索。

六、solrconfig.xml

solrconfig.xml配置文件主要定义了Solr的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。

1、 solrconfig 成员

1.1 luceneMatchVersion

表示Solr底层依赖的lucene版本

1.2 lib

lib 定义了Solr需要额外引用的jar包位置。它告诉 Solr 如何去加载 solr plugins(Solr 插件 ) 依赖的 jar 包,在 solrconfig.xml 配置文件的注释中有配置示例,例如:
<lib dir="./lib" regex=”lucene-\w+\.jar”/>
这里的 dir 表示一个 jar 包目录路径,该目录路径是相对于你当前 core 根目录的; regex 表示一个正则表达式,用来过滤文件名的,符合正则表达式的 jar 文件将会被加载,如果对应的文件不存在,会自动忽略这一配置,一般建议将其注释掉,只添加需要使用的jar包。

1.3 dataDir

用来指定一个 solr 的索引数据目录, solr 创建的索引会存放在 data\index 目录下,默认 dataDir 是相对于当前 core 目录 ( 如果 solr_home 下存在 core 的话 ) ,如果 solr_home 下不存在 core 的话,那 dataDir 默认就是相对于 solr_home 啦,不过一般 dataDir 都在 core.properties 下配置。

1.4 directoryFactory

规定了索引存储方案
1. solr.StandardDirectoryFactory,这是一个基于文件系统存储目录的工厂,它会试图选择最好的实现基于你当前的操作系统和Java虚拟机版本
2. solr.SimpleFSDirectoryFactory,适用于小型应用程序,不支持大数据和多线程
3. solr.NIOFSDirectoryFactory,适用于多线程环境,但是不适用在windows平台(很慢),是因为JVM还存在bug
4. solr.MMapDirectoryFactory,这个是solr3.1到4.0版本在linux64位系统下默认的实现。它是通过使用虚拟内存和内核特性调用 mmap 去访问存储在磁盘中的索引文件。它允许 lucene 或 solr 直接访问I/O缓存。如果不需要近实时搜索功能,使用此工厂是个不错的方案。
5. solr.NRTCachingDirectoryFactory,此工厂设计目的是存储部分索引在内存中,从而加快了近实时搜索的速度
6. solr.RAMDirectoryFactory,这是一个内存存储方案,不能持久化存储,在系统重启或服务器crash时数据会丢失。且不支持索引复制

1.5 codecFactory

编解码工厂允许使用自定义的编解码器。例如:如果想启动per-field DocValues格式, 可以在solrconfig.xml里面设置SchemaCodecFactory:
docValuesFormat=”Lucene42”: 这是默认设置,所有数据会被加载到堆内存中。
docValuesFormat=”Disk”: 这是另外一个实现,将部分数据存储在磁盘上。
docValuesFormat=”SimpleText”: 文本格式,非常慢,用于学习。
<codecFactory class="solr.SchemaCodecFactory"/>
<schemaFactory class="ClassicIndexSchemaFactory"/>

1.6 indexConfig

用于设置索引的低级别的属性

     <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>//限制token最大长度
     <writeLockTimeout>1000</writeLockTimeout>//IndexWriter等待解锁的最长时间(毫秒)。
     <maxIndexingThreads>8</maxIndexingThreads>//
     <useCompoundFile>false</useCompoundFile>//solr默认为false。如果为true,索引文件减少,检索性能降低,追求平衡。
     <ramBufferSizeMB>100</ramBufferSizeMB>//缓存
     <maxBufferedDocs>1000</maxBufferedDocs>//同上。两个同时定义时命中较低的那个。
     <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
        <int name="maxMergeAtOnce">10</int>
        <int name="segmentsPerTier">10</int>
     </mergePolicy>//合并策略
     <mergeFactor>10</mergeFactor>//合并因子,每次合并多少个segments。
     <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>//合并调度器。
     <lockType>${solr.lock.type:native}</lockType>//锁工厂。
     <unlockOnStartup>false</unlockOnStartup>//是否启动时先解锁。
     <termIndexInterval>128</termIndexInterval>//Lucene loads terms into memory 间隔
     <reopenReaders>true</reopenReaders>//重新打开,替代先关闭-再打开。
     <deletionPolicy class="solr.SolrDeletionPolicy">//提交删除策略,必须实现org.apache.lucene.index.IndexDeletionPolicy
     <str name="maxCommitsToKeep">1</str>
     <str name="maxOptimizedCommitsToKeep">0</str>
     <str name="maxCommitAge">30MINUTES</str>// OR <str name="maxCommitAge">1DAY</str> 
     <infoStream   file="INFOSTREAM.txt">false</infoStream>//相当于把创建索引时的日志输出。

注:<lockType>${solr.lock.type:native}</lockType>
设置索引库的锁方式,主要有三种:
1.single:适用于只读的索引库,即索引库是定死的,不会再更改
2.native:使用本地操作系统的文件锁方式,不能用于多个solr服务共用同一个索引库。Solr3.6 及后期版本使用的默认锁机制。
3.simple:使用简单的文件锁机制
4. hdfs: 使用HdfsLockFactory来支持读取和写入索引和事务日志文件到HDFS文件系统

1.7 updateHandler
<!--updateHandler: 这个更新处理器主要涉及底层的关于如何更新处理内部的信息。 -->
 <updateHandler class="solr.DirectUpdateHandler2">
    <updateLog>
      <str name="dir">${solr.ulog.dir:}</str>
    </updateLog>
    <autoCommit>    
      <maxDocs>10000</maxDocs> <!-- 触发自动提交前最多可以等待提交的文档数量  -->   
      <maxTime>86000</maxTime> <!-- 在添加了一个文档之后,触发自动提交之前所最大的等待时间--> 
    </autoCommit>    
    <!--一个postCommit的事件被触发当每一个提交之后  -->
    <listener event="postCommit" class="solr.RunExecutableListener">   
      <str name="exe">snapshooter</str>   <!-- exe--可执行的文件类型   -->
      <str name="dir">solr/bin</str>   <!--dir--可以用该目录做为当前的工作目录。默认为"."    -->
      <bool name="wait">true</bool>   <!-- wait--调用线程要等到可执行的返回值   --> 
      <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>  <!--args--传递给程序的参数 默认nothing-->
      <arr name="env"> <str>MYVAR=val1</str> </arr>  <!-- env 环境变量的设置 默认nothing    -->   
    </listener>   
     <autoSoftCommit> 
       <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime> 
     </autoSoftCommit>
 </updateHandler>
1.8 query
属性 说明
maxBooleanClauses 最大的BooleanQuery数量. 当值超出时,抛出 TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的.
filterCache filterCache存储了无序的lucene document id集合,1.存储了filter queries(“fq”参数)得到的document id集合结果。2还可用于facet查询3. 3)如果配置了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数量

对于所有缓存模式而言,在设置缓存参数时,都有必要在内存、cpu和磁盘访问之间进行均衡。统计信息管理页(管理员界面的Statistics)对于分析缓存的 hit-to-miss 比例以及微调缓存大小的统计数据都非常有用。而且,并非所有应用程序都会从缓存受益。实际上,一些应用程序反而会由于需要将某个永远也用不到的条目存储在缓存中这一额外步骤而受到影响。

1.9 requestDispatcher
<requestDispatcher handleSelect="false" >
    <!-- 这些设置说明Solr Requests如何被解析,以及对ContentStreams有什么限制。 -->
    <requestParsers enableRemoteStreaming="true" 
                    multipartUploadLimitInKB="2048000"
                    formdataUploadLimitInKB="2048"
                    addHttpRequestToContext="false"/>
    <!-- 设置HTTP缓存的相关参数。Never304 即告诉服务器,不管我访问的资源有没有更新过,都给我重新返回不走 Http 缓存。-->
    <httpCaching never304="true" />
</requestDispatcher>

定义当有请求访问Solr core时SolrDispatchFilter如何处理。

handleSelect是一个以前版本中遗留下来的属性,会影响请求的对应行为(比如/select?qt=XXX)。
当handleSelect=”true”时导致SolrDispatchFilter将请求转发给qt指定的处理器(前提是/select已经注册)。
当handleSelect=”false”时会直接访问/select,若/select未注册则为404。

1.10 requestHandler
<requestHandler name="/query" class="solr.SearchHandler">
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <str name="wt">json</str>
       <str name="indent">true</str>
       <str name="df">text</str>
     </lst>
  </requestHandler>

定义请求处理器行为。

这个 requestHandler 配置的是请求 URL /query 跟请求处理类 SearcherHandler 之间的一个映射关系,即你访问http://localhost:8080/solr/core/query?q=xxx 时,会交给 SearcherHandler 类来处理这个 http 请求,你可以配置一些参数来干预 SearcherHandler 处理细节。
其他的一些 requestHandler 说明就略过了,其实都大同小异,就是一个请求 URL 跟请求处理类的一个映射 , 就好比 SpringMVC 中请求 URL 和 Controller 类的一个映射。

1.11 searchComponent

用来配置查询组件比如 SpellCheckComponent 拼写检查,有关拼写检查的详细配置说明留到以后说到 SpellCheck 时再说吧。
<searchComponent name="terms" class="solr.TermsComponent"/>
用来返回所有的 Term 以及每个 document 中 Term 的出现频率
<searchComponent class="solr.HighlightComponent" name="highlight">
用来配置关键字高亮的, Solr 高亮配置的详细说明这里暂时先略过,这篇我们只是先暂时大致了解下每个配置项的含义即可,具体如何使用留到后续再深入研究。
有关 searchComponent 查询组件的其他配置我就不一一说明了,太多了。你们自己看里面的英文注释吧,如果你实在看不懂再来问我。

<searchComponent name="suggest" class="solr.SuggestComponent">
    <lst name="suggester">
      <str name="name">mySuggester</str>
      <str name="lookupImpl">FuzzyLookupFactory</str>
      <str name="dictionaryImpl">DocumentDictionaryFactory</str>
      <str name="field">cat</str>
      <str name="weightField">price</str>
      <str name="suggestAnalyzerFieldType">string</str>
    </lst>
  </searchComponent>
1.12 queryResponseWriter

这个是用来配置 Solr 响应数据转换类, JSONResponseWriter 就是把 HTTP 响应数据转成 JSON 格式, content-type 即 response 响应头信息中的 content-type, 即告诉客户端返回的数据的 MIME 类型为 text/plain ,且 charset 字符集编码为 UTF-8.
内置的响应数据转换器还有 velocity , xslt 等,如果你想自定义一个基于 FreeMarker 的转换器,那你需要实现 Solr 的 QueryResponseWriter 接口,模仿其他实现类,你懂的,然后在 solrconfig.xml 中添加类似的<queryResponseWriter> 配置即可
最后需要说明下的是 solrconfig.xml 中有大量类似 <arr> <list> <str> <int>
arr:即 array 的缩写,表示一个数组, name 即表示这个数组参数的变量名
lst即 list 的缩写,但注意它里面存放的是 key-value 键值对
bool:表示一个 boolean 类型的变量 ,name 表示 boolean 变量名,
同理还有int,long,float,str等等
str: 即 string 的缩写,唯一要注意的是 arr 下的 str 子元素是没有 name 属性的,而 list 下的 str 元素是有 name 属性的

1.13 initParams

在处理程序配置之外定义请求处理程序参数

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
  <lst name="defaults">
    <str name="df">_text_</str>
  </lst>
</initParams>

七 Solr 管理台

1. Dashboard 仪表盘

显示Solr的基本信息,包含solr版本,包含系统内存和jvm内存的使用情况,jvm参数等
dashboard

2. Logging

solr的运行日志, 用来查看solr运行是否有警告或者异常,以便及时处理
error

表头 描述
Time(Local) 记录日志时间
level 日志级别
Core 索引库
logger 处理日志的类
Message 日志信息
2.1 level

配置solr的日志级别
level

3. Core Admin

索引库管理
core
添加 索引库 前面讲过了,

4. Java Properties

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

5. Thread Dump

当前活跃线程

6. Core Selector

核心选择器,选择要操作的索引库

菜单 说明
Overview 显示一些统计信息和元数据。
Analysis 帮你设计你的Analyzer,Tokenizer和Filter。
Dataimport 展示当前的DataimportHandler的状态,默认是没有。
Documents 提供了一个让你对该Core中的数据作增删改操作的表单窗口。
Files 不是指存在Core中的业务数据,而是指该Core的配置文件,比如solrconfig.xml。
Query 一个简单的结构化查询工具。具体见(Solr页面查询各个参数解释)
Ping 按一下可以看这个Core还是不是活着的以及响应时间。
Plugins Solr自带的一些插件以及我们安装的插件的信息以及统计。
Replication 显示你当前Core的副本,并提供disable/enable功能。
Schema 展示该Core的shema数据,如果是用ManagedSchema模式,还可以通过该页面修改,增加,删除schema的字段。(对比Solr4,是一个比较实用的提升。)
Segments info 展示底层Lucence的分段信息。
6.1. Overview(概览)

查看索引的情况,例如:看看Num docs数量是否增加。包含基本统计如当前文档数;和实例信息如当前核心的配置目录;

6.2. Analysis(分析)

检验分词效果,用来诊断潜在的 文本分析 的查询/索引问题。注意FieldType需要选定为与被分析内容类型一致。

6.2.1 配置IK分词

1)、下载地址:IK分词器下载
2)、下载解压后 把两个jar文件复制到solr-7.4.0\server\solr-webapp\webapp\WEB-INF\lib中
1
3)、在solr-7.4.0\server\solr-webapp\webapp\WEB-INF\classes目录下新建一个classes目录,把下面三个文件复制
2

Ik-Analyzer5.5中的文件 各个文件的作用
IKAnalyzer.xml 这里主要是指定ext.dic和stopword.dic..,只要这3个文件在同一目录下就不用修改这里
ext.dic 是ik的自定义词库,我们可以把不当做关键字的词,,配置在这里变成关键字..如:汝淉本身不是一个关键字,,,定义在这里就是个关键字了.
stopword.dic 是ik的自定义停词词库,意味着和ext.dic作用是相反的..比如“这是”是关键字,配到停词库中,分词器就不会把“这是”当做关键字了

4)、进入之前创建的core 在solr-7.4.0\server\solr\ <索引库名>\conf下打开managed-schema 添加如下代码:

<fieldType name="text_ik" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
    </analyzer>
</fieldType> 

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

5)、重启solr 重新访问 选择刚之前创建的core
3
6)、选择Analysis 输入要搜索的中文 选择FieldType为text_ik 可以发现分词成功
4

6.3 DataImport
  1. 修改$SOLR_HOME/server/solr/<索引库名>/conf/solrconfig.xml,添加如下内容:.
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
</requestHandler>
  1. $SOLR_HOME/server/solr/<索引库名>/conf/文件目录下创建data-config.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
     driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/hobart-solr"
     user="root"
     password="root"/>
<document>
  <entity name="user" query="SELECT * FROM user ">
     <field column="uid" name="uid"/>
     <field column="usercode" name="user_code"/>
     <field column="account" name="account"/>
     <field column="password" name="password"/>
     <field column="username" name="user_name"/>
     <field column="birthday" name="birthday"/>
     <field column="gender" name="gender"/>
     <field column="lastLoginTime" name="last_login_time"/>
     <field column="updateTime" name="update_time"/>
  </entity>
</document>
</dataConfig>
  1. 修改$SOLR_HOME/server/solr/<索引库名>/conf/目录下的managed-schema文件,添加如下内容:
  <field name="uid" type="string" indexed="true" stored="true" />
  <field name="user_code" type="string" indexed="true" stored="true" />
  <field name="user_account" type="string" indexed="true" stored="true" />
  <field name="user_username" type="string" indexed="true" stored="true" />
  <field name="user_birthday" type="string" indexed="true" stored="true" />
  <field name="user_address" type="string" indexed="true" stored="true" />
  <field name="user_birthday" type="string" indexed="true" stored="true" />
  <field name="user_gender" type="string" indexed="true" stored="true" />
  <field name="user_last_login_time" type="string" indexed="true" stored="true" />
  <field name="user_update_time" type="string" indexed="true" stored="true" />
  1. 将一下jar 包 拷入 $SOLR_HOME/server/solr-webapp/webapps/WEB-INF/lib/ 下:
solr-dataimporthandler-7.3.1.jar
solr-dataimporthandler-extras-7.3.1.jar
mysql-connector-java-5.1.46.jar(因为我用的 是Mysql 所以拷mysql的驱动包,其他数据库对应拷其驱动包)
  1. 重启Solr, 会出现如下图
    dataimport
  2. 介绍
    1) commad 参数取值
    full-import 全量导入 删除以前服务器上的所有索引,然后重新导入数据
    delta-import 增量导入,只更新修改数据,可能是修改,可能是添加, 在进行增量导入时切记将clean 参数设置为false,否则将删除以前的索引
    其他参数
    clean 决定在建立索引之前,删除以前的索引(默认:true)
    commit 决定这个操作之后是否commit(默认:true)
    optimeize 决定这个操作之后是否要优化(默认:true)
    entity: entity是document下面的标签(data-config.xml)。 使用这个参数可以有选择的执行一个或多个entity。使用多个entity参数可以使得多个entity 同时 运行。如果 不选择此参数那么所有的都会被执行。
    debug 是否以调试模式运行,适用于交互开发中。(若以调试模式运行,默认不会自动提交,需加参数commit=true)
    其他见dataimport
6.4 Document

在这里 可以完成 对索引的 增 删 改
1. 在doc标签和field标签中增加权重(boost),增加权重后,可以在搜索的时候做权重过滤。

<add>
  <doc boost="2.5">
    <field name="gameId">05991</field>
    <field name="gameName" boost="2.0">angrybird</field>
  </doc>
</add>
  1. field标签
    update = “add” | “set” | “inc” 在4.0之后的版本可以自动对field做增加和删除了。
    增加字段例子
<add>
  <doc>
    <field name="gameId">05991</field>
    <field name="gameName" update="set">angrybird</field>
    <field name="skills" update="add">fly</field>
  </doc>
</add>

同一个字段多个值的例子

<add>
  <doc>
    <field name="gameId">05991</field>
    <field name="skills" update="set">fly</field>
    <field name="skills" update="set">shot</field>
    <field name="skills" update="set">dump</field>
  </doc>
</add> 

把字段清空的例子

<add>
  <doc>
    <field name="gameId">05991</field>
    <field name="skills" update="set" null="true" />
  </doc>
</add

添加json格式的索引和xml的类似,只需要在Document Type中选择json即可。
{"id":"s10001","name":"江小白"}
3. 删除索引

<delete>
   <query> id:"100861"</query>
</delete>
<commit/>

OR

<delete><id>100861</id></delete>
<commit/>  

删除所有索引

<delete><query>*:*</query></delete>
<commit/>
6.5 Files

索引库的所有配置文件

6.6 Ping

在核心名称下选择 Ping 会发出一个 ping 请求来检查核心是否启动并响应请求。
虽然在 UI 界面上可以很容易地看到 ping 响应时间,但是当由远程监视工具执行时,底层 ping 命令会更加有用:
输入如下:
http://localhost:8983/solr/<core-name>/admin/ping
这个命令将 ping 一个响应的核心名称。
输入如下:
http://localhost:8983/solr/<collection-name>/admin/ping?distrib=true
此命令将为响应 ping 给定集合名称的所有副本。
示例输出:

<response>
   <lst name="responseHeader">
      <int name="status">0</int>
      <int name="QTime">13</int>
      <lst name="params">
         <str name="q">{!lucene}*:*</str>
         <str name="distrib">false</str>
         <str name="df">_text_</str>
         <str name="rows">10</str>
         <str name="echoParams">all</str>
      </lst>
   </lst>
   <str name="status">OK</str>
</response>
6.7 Plugins/Status

Solr 插件界面显示有关每个 Solr 内核中运行的各种插件的状态和性能的信息和统计信息。您可以找到有关 Solr 高速缓存的性能,Solr 搜索者的状态以及请求处理程序和搜索组件配置的信息。

6.8. Query(查询)

这是一个查询界面,用的比较多,用来查询索引的文档,包含是否存在,排序是否正确等。稍后会介绍相关的查询参数。 博主推荐阅读

6.8. 1、常用字段
参数 含义
q 查询字符串,这个是必须的。如果查询所有: ,根据指定字段查询(Name:张三 AND Address:北京)
fq (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=Name:张三&fq=date_time:[20180712 TO 20180731],找关键字mm,并且date_time是20180712。
sort 排序,格式:sort=<field name>+ <desc | asc>[,<field name>+<desc|asc>] … 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序。
start 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows 指定返回结果最多有多少条记录,配合start来实现分页。
fl (field list)指定返回那些字段内容, *表示所有field,如果想查询指定字段用逗号或空格隔开(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:字段是严格区分大小写的】), 用逗号或空格分隔多个,不指定时,默认全返回。
df (default field)默认的查询字段,一般默认指定。
Raw Query Parameters 查询参数
wt (writer type)指定查询输出结果格式,我们常用的有json格式与xml格式。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、phps、custom。
indent off 返回的结果是否缩进,默认开启,用 indent=true | on 开启,一般调试json, php, phps, ruby输出才有必要用这个参数。
debugQuery 设置返回结果是否显示Debug信息。
dismax 单击此按钮启用 Dismax 查询解析器,博主推荐阅读
edismax 单击此按钮可启用扩展查询解析器, 博主推荐阅读
hl (high light )是否高亮 ,如hl=true表示启用高亮
hl.fl 用空格或逗号隔开的字段列表(指定高亮的字段)。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高 亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用 hl.requiredFieldMatch选项。
hl.simple.pre 高亮前面的格式
hl.simple.post 高亮后面的格式
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 点击此按钮启用拼写检查程序。博主推荐阅读

hl.snippets | 默认是1,这里设置为3个片段
q.op | 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或)

6.8.2、Solr运算符
  1. “:” 指定字段查指定值,如返回所有值:
  2. “?” 表示单个任意字符的通配
  3. ” 表示多个任意字符的通配(不能在检索的项开始使用或者?符号)
  4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
  5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
  6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
  7. 布尔操作符AND、||
  8. 布尔操作符OR、&&
  9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询)
  10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
  11. ( ) 用于构成子查询
  12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
  13. {} 不包含范围检索,如检索某时间段记录,不包含头尾
    date:{200707 TO 200710}
  14. / 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /

    注:①“+”和”-“表示对单个查询单元的修饰,and 、or 、 not 是对两个查询单元是否做交集或者做差集还是取反的操作的符号
    比如:AB:china +AB:america ,表示的是AB:china忽略不计可有可无,必须满足第二个条件才是对的,而不是你所认为的必须满足这两个搜索条件
    如果输入:AB:china AND AB:america ,解析出来的结果是两个条件同时满足,即+AB:china AND +AB:america或+AB:china +AB:america
    总而言之,查询语法: 修饰符 字段名:查询关键词 AND/OR/NOT 修饰符 字段名:查询关键词。



Solr中的可用函数, 博主[推荐阅读](https://blog.csdn.net/jiangchao858/article/details/53844584)
6.8.3 Solr查询语法
  1. 最普通的查询,比如查询姓张的人( Name:张),如果是精准性搜索相当于SQL SERVER中的LIKE搜索这需要带引号(”“),比如查询含有北京的(Address:”北京”)
  2. 多条件查询,注:如果是针对单个字段进行搜索的可以用(Name:搜索条件加运算符(OR、AND、NOT) Name:搜索条件),比如模糊查询( Name:张 OR Name:李 )单个字段多条件搜索不建议这样写,一般建议是在单个字段里进行条件筛选,如( Name:张 OR 李),多个字段查询(Name:张 + Address:北京 )
  3. 排序,比如根据姓名升序(Name asc),降序(Name desc)
6.9 Replication

Solr 流界面允许您输入流式表达式并查看结果。它与查询屏幕非常相似,不同的是输入框位于顶部,所有选项必须在表达式中声明。
该界面会将所有内容插入到流式表达式本身,因此您不需要输入带有主机名、端口、集合等的完整 URI。只需在expr= part 之后输入表达式,URL 就会根据需要动态构建。
在输入框下,执行按钮将运行表达式。“with explanation” 选项将显示已执行的流式表达的各个部分。在此之下,将显示流式结果。也可以在浏览器中查看输出的 URL。

6.10. Schema

显示当前的schema的配置文件,即schema.xml的内容,例如:可以看到schema.xml 中的配置的字段等信息。
使用 Solr schema界面,您可以在浏览器窗口中查看架构数据。
如果您从分析界面访问了此窗口,则它将打开到特定字段、动态字段规则或字段类型。如果未选择任何选项,请使用下拉菜单选择字段或字段类型。
架构浏览器界面提供了有关 Schema 中每个特定字段和字段类型的大量有用信息,并提供了使用 Schema API(如果已启用)添加字段或字段类型的快速 UI 。在上面的例子中,我们选择了这个 cat 字段。在主视图窗口的左侧,我们看到字段名称,它被复制到text(由于copyField规则),并使用 strings 字段类型。单击这些字段或字段类型名称之一,您可以看到相应的定义。

6.11 Segments info

7.Assistance

Assistance

链接 描述
Documentation 导航到Apache Solr文档
Issue Tracker 导航到Apache Solr项目的JIRA问题跟踪服务器
IRC Channel 导航到Solr的IRC即时聊天房间
Community forum 导航到Apache Wiki页面,该页面有更多关于参与SoR用户社区邮件列表的方法的信息
Solr Query Syntax 导航到询语法和解析参考指南。

注:
其他 solr 有用资源
solr 官方文档
w3c School Solr说明
CSDN cj96248 博主

猜你喜欢

转载自blog.csdn.net/loumoxiaozi/article/details/81186916
今日推荐