1. Solr Core简介
- Core是一个单一的索引数据,即多个Document打包成的一个集合。(索引是由多个Document组成的,Solr中的Document是扁平化的,即两个Document的域可以完全不同)
- 关于分Core存放,要明白其目的是为了解决生产环境中的如下关键需求,同时也要考虑到分Core所带来的查询性能影响:
- 重建索引
- 配置变更影响最小化
- 索引合并和分裂
- Core 热交换
-
Core conf下的文件说明
conf文件目录
- currency.xml: 各种货币之间的汇率常量配置。之所以需要配置这个文件是因为官方的demo提供的schema.xml中定义currencyField即货币域。
- protwords.txt: 可以用来配置那些不需要进行次型还原的英文单词,比如taken, takes还原成take。该文件由KeywordMarkerFilterFactory加载。
- schema.xml: 这个配置文件主要用来定义你索引数据需要的域和域类型,即你需要在这里声明索引数据中需要那些域以及每个域的类型。
- solrconfig.xml: 主要用来配置索引创建、查询、solr缓存以及搜了组件处理器等信息。
- stopwords.txt: 停用词字典文件,由StopFilterFactory加载。
-synonyms.txt: 同义词字典文件,由SynonymFilterFactory加载。
-lange文件夹下的字典文件: 也均为停用词字典文件,只不过这里分各国语言进行动态加载,如果当前是中文系统,就回家再stopwords_zh.txt字典文件。en、zh是各国代号缩写。
-
创建core
core配置
- name: 即你的core名称,注意core名称必须全局唯一,不可重复。
- instanceDir: 表示你的core根目录,这里是相对于你的solr_home.
- dataDir: 表示你当前core的数据目录, 这里是相对于上面的instanceDir。
- config: 表示你的solrconfig.xml存放路径,迷人是相对于你instanceDir下的conf目录。
- schema: 表示你的schema.xml存放路径,默认也是相对于你instanceDir下的conf目录。
- core的管理
- reload:当修改了core的solrconfi.xml或者schema.xml后,不重启servlet容器的情况下,可以使用reload来重新加载core而使得修改生效。实际过程是一个旧core的卸载和 新core的启动操作。
- unload:将core从solr中取消注册,这样core就脱离了solr的管理,而硬盘上core的文件不会因此而被删除。
- rename:修改core的名称,会影响访问core的url但并不会修改硬盘上的根目录名称。
- swap:热交换实质上是core目录交换。
- 日志:可以通过solr web左侧logging菜单进行观察,或者到data\tlog目录下查看。
- 状态:在solr web选中core在右侧会显示状态信息,或者通过以下url进行状态接口调用来查看。
例1:查看名称为core的core的状态
http://localhost:8080/solr/admin/cores?action=STATUS&core=core
例2:查看所有core的状态
http://localhost:8080/solr/admin/cores?action=STATUS - 索引合并:即讲多个索引目录里的数据合并到一个新的索引目录中。
例1:将C:/solr_home/core/data/index文件和C:/solr_home/core2/data/index文件合并到core中
http://localhost:8080/solr/admin/cores?action=mergeindexes&core=core&indexDir=C:/solr_home/core/data/index&indexDir=C:/solr_home/core2/data/index
例2:将core和core2中的索引合并到core
http://localhost:8080/solr/admin/cores?action=mergeindexes&core=core&srcCore=core&srcCore=core2
除了通过solr提供的接口外,还可以使用lucene提供的一个索引工具类IndexMergeTool,该类在org.apache.lucene.misc的 lucene-misc-version.jar包中,而lucene-misc-version.jar又依赖lucene-core-version.jar,所以IndexMergeTool的使用方式如下:
java -cp lucene-core-version.jar:lucene-misc-version.jar org.apache.lucene.misc.IndexMergeTool C:/newindex C:/solr_home/core/data/index C:/solr_home/core2/data/index
- 索引拆分:与合并相反,可以将索引文件拆分到不同的目录或者core中
例1:将core中的索引拆分到指定目录
http://localhost:8080/solr/admin/cores?action=SPLIT&core=core&path=C:/temp/index/1&path=C:/temp/index/2
例2:将core中的索引拆分到指定core
http://localhost:8080/solr/admin/cores?action=SPLIT&core=core&targetCore=core&targetCore=core2
2.Core Http接口(不区分大小写)
-
STATUS:获取指定core的运行状态信息,若没有指定core,那么就返回所有core状态信息。
例1:查看名称为core的core的状态
http://localhost:8080/solr/admin/cores?action=STATUS&core=core
例2:查看所有core的状态
http://localhost:8080/solr/admin/cores?action=STATUS -
CREATE:创建一个新core,前提是core目录已经提前创建好且依赖的solrconfig.xml/schema.xml都创建并配置正确,如果提供了persist=true参数,那么新core的配置会被保存到solr.xml中。
例:http://localhost:8080/solr/admin/cores?action=CREATE&name=coreX&instanceDir=path_to_instance_directory&config=config_file_name.xml&schema=schema_file_name.xml&dataDir=data
- instanceDir:必要参数
- config、schema以及dataDir:可选参数
- solr4.3之后的版本还额外支持以下参数:
> loadOnstartup:表示当Solr启动时是否加载该core;
> transient:表示当瞬态core数量达到了solr.xml中<core>元素配置的transientCacheSize参数值时,是否需要写在当前core。
-
RELOAD:重建加载指定core,在新core加载未完成前,对于该core的请求还是有旧core来处理,直到新core加载完成,那么旧core就会被写在,之后的请求交友新core来处理。
例:http://localhost:8080/solr/admin/cores?action=RELOAD&core=core0 -
RENAME:重命名一个core的访问名称
例:将core2重命名成core
http://localhost:8080/solr/admin/cores?action=RENAME&core=core2&other=core -
SWAP:自动交换两个一致core的名称,当你需要使用一个替补core来替换线上活跃中的core,并且要求替换后原来的旧从core继续运行以保证能随时撤销回原先的状态。
例:http://localhost:8080/solr/admin/cores?action=SWAP&core=core1&other=core0 -
UNLOAD:将指定core从solr中移除,在core被完全移除之前,之前未处理完的core请求会继续处理,之后发送给该core的新请求就不再受理。
例:http://localhost:8080/solr/admin/cores?action=UNLOAD&core=core0
可选参数如下:
- deleteIndex:移除core的同时是否需要删除该core下的索引数据,默认不会删除core的索引数据。
例:http://localhost:8080/solr/admin/cores?action=UNLOAD&core=core0&deleteIndex=true - deleteDataDir:移除core的同时是否需要删除当前core的dataDir目录。
- deleteInstanceDir:移除core的同时是否需要删除当前core实例的根目录。
例:http://localhost:8080/solr/admin/cores?action=UNLOAD&core=core0&deleteInstanceDir=true
-
LOAD:加载指定core
例:http://localhost:8080/solr/admin/cores?action=LOAD&core=core0&persist=true
persist参数表示是否需要将当前core的备至保存到solr.xml配置文件中。
3.添加索引值core
-
Solr控制台
Solr控制台
- Request-Handler:表示添加索引接口对应的请求URL,只不过这里省去了固定前缀http://localhost:8080/solr/{coreName};
- Document Type:表示你要添加的Document类型,Solr支持了常见的集中数据格式,如CSV,JSON,XML等;
- Commit Within:表示索引必须在限定的时间内完成提交,否则放弃操作,单位为毫秒,这个设置主要时为了防止索引提交长期阻塞;
- Overwrite:覆盖的意思,即是否需要根据索引数据的uniqueKey来覆盖之前添加的Document,只要uniqueKey值相等,那么就会进行Document覆盖。此参数默认为true。注意:前提是你有在schema.xml里配置uniqueKey,否则即使你设置Overwrite为true,也不会覆盖。
- Boost:此参数用来设置当前你要添加的索引的权重值,默认值为1.0;
- Documents:你要添加的索引数据。
- Solr DIH(Data Import Handler)
DIH能帮做什么?
1- 他能读取数据库的数据并创建索引;
2- 他能够基于配置的方式把数据例表的列甚至多个表的数据聚合并解析成一个Document;
3- 他支持基于配置的全量和增量数据导入;
4- 他能够实现基于配置的定时全量和增量索引;
5- 他能基于HTTP方式读取并索引XML文件;
6- 他支持各种基于插件式的datasource和formate配置;
如何开启DIH功能?
1- 在solrconfig.xml 中配置dataimport请求处理器,并制定data-config.xml配置文件路径;<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
2- 如果需要配置增量导入,则需要在配置一个DataImportHandler,指定delta-data-config.xml以及依赖jar包路径;
<requestHandler name="/deltaimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">delta-data-config.xml</str> </lst> <dataDir>C:\solr_home\core\data</dataDir> <lib dir="./lib" regex=".*\.jar"/> </requestHandler>
依赖jar包如下图所示,这些依赖的jar包可以从/solr5.3.1/contrib/extraction/lib以及/solr5.3.1/dist路径下找到。
依赖jar包
3- 配置data-config.xml<dataConfig> <dataSource name="fileDataSource" type="FileDataSource"/> <!-- <document> <entity name="tika-test" processor="TikaEntityProcessor" url="C:/docs/solr-word.pdf" format="text"> <field column="Author" name="author" meta="true"/> <field column="title" name="title" meta="true"/> <field column="text" name="text"/> </entity> </document> --> <dataSource name="urlDataSource" type="BinURLDataSource"/> <document> <entity name="files" dataSource="null" rootEntity="false" processor="FileListEntityProcessor" baseDir="c:/docs" fileName=".*\.(doc)|(pdf)|(docx)|(txt)" onError="skip" recursive="true"> <field column="fileAbsolutePath" name="filePath"/> <field column="fileSize" name="size"/> <field column="fileLastModified" name="lastModified"/> <entity processor="PlainTextEntityProcessor" name="txtfile" >url="${files.fileAbsolutePath}" dataSource="fileDataSource"> <field column="plainText" name="text"/> </entity> </entity> </document> </dataConfig>
- baseDir:表示获取这个文件夹下的文件;
- fileName:支持正则表达式来过滤一些baseDir文件夹下你想/不想被索引的文件;
- processor:用来生成实例Entity的处理器,而不同的Entity默认会生成不同的域Field。FileListEntityProcessor处理器会根据指定的文件夹生成多个Entity,且生成的Entity会包含fileAbsolutePath,fileSize,fileLastModified,fileName这几个域。注意,这几个域是FileListEntityProcessor内置的,不能随意更改。
- recursive:表示是否递归查找子目录下的文件;
- onError:表示当出现异常时是否跳过这个条件不处理;
4- 在schema.xml中定义域
<field name="userName" type="string" indexed="true" stored="true" >omitNorms="true"/> <field name="sex" type="boolean" indexed="true" stored="true" omitNorms="true"/> <field name="birth" type="cndate" indexed="true" stored="true" omitNorms="true"/> <field name="salary" type="int" indexed="true" stored="true" omitNorms="true"/> <field name="text" type="text_ik" indexed="true" stored="true" omitNorms="true" multiValued="false"/> <field name="author" type="string" indexed="true" stored="true"/> <field name="title" type="string" indexed="true" stored="true"/> <field name="fileName" type="string" indexed="true" stored="true"/> <field name="filePath" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="size" type="long" indexed="true" stored="true"/> <field name="lastModified" type="cndate" indexed="true" stored="true"/> <field name="id" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
5- 在C:/docs目录下准备一些txt文件;注意:txt文件编码请保证是UTF-8格式
6- 重启tomcat,通过full-dataimport导入;
- Request:表示solr接收到了多少个http请求;
- Fetched:表示solr提取到了多少个文件;
- Skipped:表示solr跳过了多少个文件未处理;
Processed:表示solr成功导入了多少个document;
导入结果
查询导入结果
- 索引JSON/XML/CSV文件
当我们想一次性通过JSON/XML/CSV导入多条数据而非单条数据时,我们可以这么做。
- JSON:按照以下格式在Documents导入中选择类型为JSON或者rowJSON,如果没有添加参数commit则需要重启solr才能将数据提交生效,我们可以添加commit参数在url中来使得硬提交完成而试试的将数据提交生效。
{
"add":{
"doc":{...}
},
"add":{
"doc":{...}
},
...
}
{...}为你实际想要添加的Document对象数据,其余部分为固定格式。如果你的原始JSON数据格式不符合以上形式,需要转换格式成以上形式。
例:
JSON导入案例
- XML:按照以下格式在Documents导入中选择类型为XML或者rowXML,如果没有添加参数commit则需要重启solr才能将数据提交生效,我们可以添加commit参数在url中或者添加<commit/>标签来使得硬提交完成而试试的将数据提交生效。
<add>
<doc>
<id>xxx</id>
<name>xxx</name>
<age>xxx</age>
</doc>
<doc>
<id>xxx</id>
<name>xxx</name>
<age>xxx</age>
</doc>
...
</add>
<doc></doc>标签之前的为实际Document对象;
XML导入案例
- 如果想更新Document,把<add>元素改成<update>即可;
- <add>标签还有两个可选属性:1)overwrite:true|false,默认为false,表示对于拥有相同uniqueKey的Document是否需要覆盖;2) commitWithin:表示Document必须在指定的毫秒数内提交完成,否则就放弃提交;
- 为Document设置权重
<add> <doc boost="2.5"> <field name="employeeId">05991</field> <field name="office" boost="2.0">Bridgewater</field> </doc> </add>
- 添加多值域
<add> <doc> <field name="employeeId">05991</field> <field name="skills" update="set">Python<field> <field name="skills" update="set">Java<field> <field name="skills" update="set">Solr<field> </doc> </add>
- 将某个域值设为null
<add> <doc> <field name="employeeId">05991</field> <field name="skills" update="set" null="true"/> </doc> </add>
可以在<add>标签下添加<commit/><optimize/>标签,类似于Lucene显式调用write.commit(); writer.optimize();
例: commit&optimize
- 根据uniqueKey删除指定Document
<delete><id>05991</id></delete>
- 根据查询条件删除符合要求的记录
<delete> <query>office:Bridgewate</query> </delete>
-
CSV:按照以下格式在Documents导入中选择类型为CSV,数据第一行为域名用逗号分隔,第二行开始为Document对象数据,域之间以逗号分隔,Document之间以换行符分隔,提交后即可查询。
CSV导入案例
网友评论