solr php mysql_Solr 导入同步数据库数据与查询

Solr 导入同步数据库数据与查询

首先我往数据库里面插入了一条数据

1300d9e5d775bd99b5c78eaa06cb01b2.png

进入后台

导入数据

9dd6c95bbcda47ed4e106dd2169a0b39.png

试着查询

2b6f25e7ff81ecc0bf6d45ea677264b8.png

Solr提供了full-import和delta-import两种导入方式

多个entity,每个entity有各自的last_index_time,可以通过dataimporter.entityname.last_index_time来取各自的最后更新时间来进行增量更新。

多个entity时,进行full-import时指明导入某个entity,

会把之前创建的索引通通删除(包括其他ENTITY创建的索引)重新建,这是要注意的地方.我开始以为是只删除当前entity的所有索引再重新full-import,结果不是这样的,加上参数clean = false;但也会删除相同id的(在 scheam.xml 的uniqueKey 声明的)

所谓delta-import主要是对于数据库(也可能是文件等等)中增加或者被修改的字段进行导入。主要原理是利用率每次我们进行import的时候在solr.home\conf下面生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息。这个文件如下:

Wed Apr 21 16:48:27 CST 2010

last_index_time=2010-04-21 16:48:24

id.last_index_time=2010-04-21 16:48:24

其实last_index_time是最近一次索引(full-import或者delta-import)的时间。

通过比较这个时间和我们数据库表中的timestamp列即可得出哪些是之后修改或者添加的。

下面是操作步骤:

1.       配置好请求处理器。(这个见我的上一篇文章)

修改data-config.xml如下:

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://192.168.10.10:3306/workshop"

user="homestead"

password="secret"

batchSize="100"

autoCommit="false" />

query="SELECT id,user,title,content,timestamp,text FROM article"

deltaImportQuery="SELECT id,user,title,content,timestamp,text FROM article where id='${dataimporter.delta.id}'"

deltaQuery="select id from article where timestamp > '${dataimporter.last_index_time}'">

注意entity标签的参数:

l  deltaImportQuery

仅适用于delta-import的参数。DIH会检查数据库中的最后修改时间是否与我们

这个示例为了尽可能简单,没有使用多表。数据库对应表结构如下:

id    Integer       increment

user  varchar(45)

title varchar(45)

content varchar(2000)

timestamp datatime

text    varchar(2000)

在schema.xml增加相应的字段,相同可以抽出,需要使用分词的则把type指向分词类型。(type="textComplex")

相关参数如下:

entity

entity是document下面的标签(data-config.xml)。使用这个参数可以有选择的执行一个或多个entity   。使用多个entity参数可以使得多个entity同时运行。如果不选择此参数那么所有的都会被运行。

clean

选择是否要在索引开始构建之前删除之前的索引,默认为 true

commit

选择是否在索引完成之后提交。默认为 true

optimize

是否在索引完成之后对索引进行优化。默认为 true

debug

是否以调试模式运行,适用于交互式开发(interactive development mode)之中。

请注意,如果以调试模式运行,那么默认不会自动提交,请加参数commit=true

为了演示我使用我之前demo 的数据给大家进行查询演示

bc6e6340795242be321dd1b06837ba2e.png

一.基本查询

q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=:,

fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

start  返回结果的第几条记录开始,一般分页用,默认0开始

rows  指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

sort  排序方式,例如id  desc 表示按照 “id” 降序

wt  (writer type)指定输出格式,有 xml, json, php等

fq  (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。

df   默认的查询字段,一般默认指定。

qt  (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

indent   返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

version   查询语法的版本,建议不使用它,由服务器指定默认值。

二. Solr的检索运算符

“:”  指定字段查指定值,如返回所有值:

“?”  表示单个任意字符的通配

“”  表示多个任意字符的通配(不能在检索的项开始使用或者?符号)

“~”  表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。

AND、||  布尔操作符

OR、&&  布尔操作符

NOT、!、-(排除操作符不能单独与项使用构成查询)

“+”  存在操作符,要求符号”+”后的项必须在文档相应的域中存在²

( )  用于构成子查询

[]  包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]

{}  不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

三. 高亮

h1  是否高亮,hl=true,表示采用高亮

hl.fl  设定高亮显示的字段,用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。

hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。

hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

hl.highlightMultiTerm   如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。

hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

四. 分组

这是facet的官方wiki,里面有facet各个参数的详细说明。所以这里只说一些常用的。

Facet是Solr的核心搜索功能,主要是导航(Guided Navigation)、参数化查询(Paramatic Search)。Facet的主要好处是在搜索的同时,可以按照Facet条件进行分组统计,给出导航信息,改善搜索体验。

Facet主要分为:Field Facet 和  Date Facet 两大类

1. Field Facet

facet 参数字段必须被索引

facet=on 或 facet=true

facet.field  分组的字段

facet.prefix  表示Facet字段前缀

facet.limit   Facet字段返回条数

facet.offict  开始条数,偏移量,它与facet.limit配合使用可以达到分页的效果

facet.mincount  Facet字段最小count,默认为0

facet.missing  如果为on或true,那么将统计那些Facet字段值为null的记录

facet.sort  表示 Facet 字段值以哪种顺序返回 .格式为 true(count)|false(index,lex),true(count) 表示按照 count 值从大到小排列,false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count)

2. Date Facet

对日期类型的字段进行 Facet.  Solr 为日期字段提供了更为方便的查询统计方式 .注意 , Date Facet的字段类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .

facet.date  该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.

facet.date.start 起始时间 , 时间的一般格式为 ” 2015-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 ,

facet.date.end  结束时间

facet.date.gap 时间间隔,如果 start 为 2015-1-1,end 为 2016-1-1,gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 .

facet.date.hardend  表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔. 取值可以为 true|false, 默认为 false.

例 start 为 2015-1-1,end 为 2015-12-21,gap 为 ”+1MONTH”, 如果hardend 为 false,则,最后一个时间段为 2015-12-1 至 2016-1-1; 反之,如果 hardend 为 true,则,最后一个时间段为 2015-12-1 至 2015-12-21.

注意:Facet的字段必须被索引,无需分词,无需存储。无需分词是因为该字段的值代表了一个整体概念,无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,给出相关的分组信息,从而改善搜索体验。

本作品采用《CC 协议》,转载必须注明作者和本文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值