Solr基础(上)

1. Solr Core简介
  1. Core是一个单一的索引数据,即多个Document打包成的一个集合。(索引是由多个Document组成的,Solr中的Document是扁平化的,即两个Document的域可以完全不同)
  2. 关于分Core存放,要明白其目的是为了解决生产环境中的如下关键需求,同时也要考虑到分Core所带来的查询性能影响:
  • 重建索引
  • 配置变更影响最小化
  • 索引合并和分裂
  • Core 热交换
  1. 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是各国代号缩写。
  1. 创建core


    core配置
  • name: 即你的core名称,注意core名称必须全局唯一,不可重复。
  • instanceDir: 表示你的core根目录,这里是相对于你的solr_home.
  • dataDir: 表示你当前core的数据目录, 这里是相对于上面的instanceDir。
  • config: 表示你的solrconfig.xml存放路径,迷人是相对于你instanceDir下的conf目录。
  • schema: 表示你的schema.xml存放路径,默认也是相对于你instanceDir下的conf目录。
  1. core的管理

除了通过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

2.Core Http接口(不区分大小写)
  1. 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
  2. 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。
  1. RELOAD:重建加载指定core,在新core加载未完成前,对于该core的请求还是有旧core来处理,直到新core加载完成,那么旧core就会被写在,之后的请求交友新core来处理。
    例:http://localhost:8080/solr/admin/cores?action=RELOAD&core=core0
  2. RENAME:重命名一个core的访问名称
    例:将core2重命名成core
    http://localhost:8080/solr/admin/cores?action=RENAME&core=core2&other=core
  3. SWAP:自动交换两个一致core的名称,当你需要使用一个替补core来替换线上活跃中的core,并且要求替换后原来的旧从core继续运行以保证能随时撤销回原先的状态。
    例:http://localhost:8080/solr/admin/cores?action=SWAP&core=core1&other=core0
  4. UNLOAD:将指定core从solr中移除,在core被完全移除之前,之前未处理完的core请求会继续处理,之后发送给该core的新请求就不再受理。
    例:http://localhost:8080/solr/admin/cores?action=UNLOAD&core=core0
    可选参数如下:
  1. LOAD:加载指定core
    例:http://localhost:8080/solr/admin/cores?action=LOAD&core=core0&persist=true
    persist参数表示是否需要将当前core的备至保存到solr.xml配置文件中。
3.添加索引值core
  1. 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:你要添加的索引数据。
  1. 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;


    导入结果

    查询导入结果
  1. 索引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导入案例
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 一 基本说明 简单来说Solr是基于Lucene的高性能的,开源的Java企业搜索服务器。Solr可以看作一个We...
    明翼阅读 2,024评论 0 2
  • 0、理解索引 0.1 启动solr搜索服务器 第一步:配置环境变量Java-home, 将jdk改成jre。 第...
    段鱼阅读 456评论 0 0
  • 1理解索引 1.1定位 techproducts 内核所在的文件目录 主要有两个文件,conf和data conf...
    不会唱歌的我阅读 312评论 0 0
  • “世界不停在旋转, 朝着早晨的方向, 每天都有新的日出, 即使夜晚黑暗又漫长。” 每一天,不同地方的人们都...
    来日可方长阅读 1,281评论 0 0
  • 统合综效:求同存异,从报仇到妥协最后到合作,实现创造性合作!让1+1>3
    布布_9285阅读 80评论 0 0