最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

SOLR查询,SOLR语法,SOLR更新

IT圈 admin 38浏览 0评论

2024年9月24日发(作者:贰莉)

一.基本查询

q–查询字符串,必须的。

fl–指定返回那些字段内容,用逗号或空格分隔多个。

start–返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。

rows–指定返回结果最多有多少条记录,配合start来实现分页。

sort–排序,格式:sort=+[,+]…。示例:(inStockdesc,priceasc)表示先“inStock”

降序,再“price”升序,默认是相关性降序。

wt–(writertype)指定输出格式,可以有xml,json,php,phps,后面solr1.3增加的,要用通知我们,因为默认没有打开。

fq–(filterquery)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001TO20091031],

找关键字mm,并且date_time是20081001到20091031之间的。

–覆盖的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定

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

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

-排除在要排除的词前加上“-”(不包含”号)号

其它

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

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

[Solr的检索运算符]

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

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

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

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

以上的记录。

²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakartaapache”~10

“^”²控制相关度检索,如检索jakartaapache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4

apache

布尔操作符AND、||²

布尔操作符OR、²&&

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

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

()用于构成子查询²

²[]包含范围检索,如检索某时间段记录,包含头尾,date:[200707TO200710]

{}²不包含范围检索,如检索某时间段记录,不包含头尾

date:{200707TO200710}

”转义操作符,特殊字符包括+–&|!(){}[]^”~*?:“

.

高亮

hl-highlight,h1=true,表示采用高亮。可以用=field1,field2来设定高亮显示的字段。

:用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么

就会高亮默认字段standardhandler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,

那么要考虑启用edFieldMatch选项。

eFieldMatch:

如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味着它可能匹配某个字段却高亮一个不同的字段。如果

使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用copy-field指令),那么还是把它设为false,这样搜

索结果能表明哪个字段的查询文本未被找到

aseHighlighter:

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

ghtMultiTerm

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

ts:

这是highlighted片段的最大数。默认值为1,也几乎不会修改。如果某个特定的字段的该值被置为0(如ts=0),这就表明

该字段被禁用高亮了。你可能在=*时会这么用。

ze:

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

ontiguous:

如果被置为true,当snippet重叠时会merge起来。

lyzedChars:

会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1

ateField:

如果没有生成snippet(没有terms匹配),那么使用另一个字段值作为返回。

ernateFieldLength:

如果ateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值是应该为

ts*ze这样返回结果的大小就能保持一致。

ter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。

显然这不够用,你可以看看和中highlighting元素是如何配置的。

注意在不论原文中被高亮了什么值的情况下,如预先已存在的emtags,也不会被转义,所以在有时会导致假的高亮。

nter:

这个是solr制定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是

一种非典型的高级选项。为了知道默认设置和fragmenters(andformatters)是如何配置的,可以看看中的highlight段。

regex的fragmenter有如下选项:

n:正则表达式的pattern

:这是ze能变化以适应正则表达式的因子。默认值是0.6,意思是如果ze=100那么fragment的大小会从40-160.

.

分组查询:

acet

Facet字段通过在请求中加入””参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如

/select?q=联想

&facet=on

&=cpu

&=videoCard

各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独

的Facet字段.应用于单独的字段时通过

f.字段名.参数名=参数值

这种方式调用.比如参数应用于cpu字段,可以采用如下形式

=Intel

表示Facet字段值的前缀.比如”=cpu&=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”

AMD”开头的cpu型号将不会被统计在内.

表示Facet字段值以哪种顺序返回.可接受的值为true(count)|false(index,lex).true(count)表示按照count值从大到小排列.

false(index,lex)表示按照字段值的自然顺序(字母,数字的顺序)排列.默认情况下为true(count).当值为负数时,默认=

false(index,lex).

限制Facet字段返回的结果条数.默认值为100.如果此值为负数,表示不限制.

返回结果集的偏移量,默认为0.它与配合使用可以达到分页的效果.

nt

限制了Facet字段值的最小count,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.

g

默认为””,如果设置为true或者on,那么将统计那些该Facet字段值为null的记录.

取值为enum或fc,默认为fc.该字段表示了两种Facet的算法,与执行效率相关.

enum适用于字段值比较少的情况,比如字段类型为布尔型,或者字段表示中国的所有省份.Solr会遍历该字段的所有取值,并从filterCache里为

每个值分配一个filter(这里要求里对filterCache的设置足够大).然后计算每个filter与主查询的交集.

fc(表示FieldCache)适用于字段取值比较多,但在每个文档里出现次数比较少的情况.Solr会遍历所有的文档,在每个文档内搜索Cache内的

值,如果找到就将Cache内该值的count加1.

当=enum时,此参数其作用,minDf表示minimumdocumentfrequency.也就是文档内出现某个关键字的最少次数.该参数默

认值为0.设置该参数可以减少filterCache的内存消耗,但会增加总的查询时间(计算交集的时间增加了).如果设置该值的话,官方文档建议优先

尝试25-50内的值.

cet

日期类型的字段在文档中很常见,如商品上市时间,货物出仓时间,书籍上架时间等等.某些情况下需要针对这些字段进行Facet.不过时间字段的

取值有无限性,用户往往关心的不是某个时间点而是某个时间段内的查询统计结果.Solr为日期字段提供了更为方便的查询统计方式.当然,字段

的类型必须是DateField(或其子类型).

需要注意的是,使用DateFacet时,字段名,起始时间,结束时间,时间间隔这4个参数都必须提供.

与FieldFacet类似,DateFacet也可以对多个字段进行Facet.并且针对每个字段都可以单独设置参数.

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

起始时间,时间的一般格式为”1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具体格式可以参

考eld的javadoc.

结束时间.

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

意”+”因为是特殊字符所以应该用”%2B”代替.

d

取值可以为true|false,默认为false.它表示gap迭代到end处采用何种处理.举例说明start为2009-1-1,end为2009-12-25,gap为”

+1MONTH”,hardend为false的话最后一个时间段为2009-12-1至2010-1-1;hardend为true的话最后一个时间段

为2009-12-1至2009-12-25.

取值范围为before|after|between|none|all,默认为none.

before会对start之前的值做统计.

after会对end之后的值做统计.

between会对start至end之间所有值做统计.如果hardend为true的话,那么该值就是各个时间段统计值的和.

none表示该项禁用.

all表示before,after,all都会统计.

举例:

&facet=on

&=date

&=2009-1-1T0:0:0Z

&=2010-1-1T0:0:0Z

&=%2B1MONTH

&=all

返回结果:

5

1

5

+1MONTH

2010-01-01T00:00:00Z

180

5

54

uery

FacetQuery利用类似于filterquery的语法提供了更为灵活的Facet.通过参数,可以对任意字段进行筛选.

例1:

&facet=on

&=date:[2009-1-1T0:0:0ZTO2009-2-1T0:0:0Z]

&=date:[2009-4-1T0:0:0ZTO2009-5-1T0:0:0Z]

返回结果:

2009-2-1T0:0:0Z]">5

3

例2:

&facet=on

&=date:[2009-1-1T0:0:0ZTO2009-2-1T0:0:0Z]

&=price:[*TO5000]

返回结果:

2009-2-1T0:0:0Z]">5

116

例3:

&facet=on

&=cpu:[ATOG]

返回结果:

11

操作符

可以用key操作符为Facet字段取一个别名.

例:

&facet=on

&={!key=中央处理器}cpu

&={!key=显卡}videoCard

返回结果:

48

28

63

24

21

8

8

7

6

操作符和ex操作符

当查询使用filterquery的时候,如果filterquery的字段正好是Facet字段,那么查询结果往往被限制在某一个值内.

例:

&fq=screenSize:14

&facet=on

&=screenSize

返回结果:

107

0

0

可以看到,屏幕尺寸(screenSize)为14寸的产品共有107件,其它尺寸的产品的数目都是0,这是因为在filter里已经限制了screenSize:14.这

样,查询结果中,除了screenSize=14的这一项之外,其它项目没有实际的意义.

有些时候,用户希望把结果限制在某一范围内,又希望查看该范围外的概况.比如上述情况,既要把查询结果限制在14寸屏的笔记本,又想查看一

下其它屏幕尺寸的笔记本有多少产品.这个时候需要用到tag和ex操作符.

tag就是把一个filter标记起来,ex(exclude)是在Facet的时候把标记过的filter排除在外.

例:

&fq={!tag=aa}screenSize:14

&facet=on

&={!ex=aa}screenSize

返回结果:

107

40

34

2024年9月24日发(作者:贰莉)

一.基本查询

q–查询字符串,必须的。

fl–指定返回那些字段内容,用逗号或空格分隔多个。

start–返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。

rows–指定返回结果最多有多少条记录,配合start来实现分页。

sort–排序,格式:sort=+[,+]…。示例:(inStockdesc,priceasc)表示先“inStock”

降序,再“price”升序,默认是相关性降序。

wt–(writertype)指定输出格式,可以有xml,json,php,phps,后面solr1.3增加的,要用通知我们,因为默认没有打开。

fq–(filterquery)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001TO20091031],

找关键字mm,并且date_time是20081001到20091031之间的。

–覆盖的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定

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

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

-排除在要排除的词前加上“-”(不包含”号)号

其它

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

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

[Solr的检索运算符]

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

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

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

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

以上的记录。

²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakartaapache”~10

“^”²控制相关度检索,如检索jakartaapache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4

apache

布尔操作符AND、||²

布尔操作符OR、²&&

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

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

()用于构成子查询²

²[]包含范围检索,如检索某时间段记录,包含头尾,date:[200707TO200710]

{}²不包含范围检索,如检索某时间段记录,不包含头尾

date:{200707TO200710}

”转义操作符,特殊字符包括+–&|!(){}[]^”~*?:“

.

高亮

hl-highlight,h1=true,表示采用高亮。可以用=field1,field2来设定高亮显示的字段。

:用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么

就会高亮默认字段standardhandler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,

那么要考虑启用edFieldMatch选项。

eFieldMatch:

如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味着它可能匹配某个字段却高亮一个不同的字段。如果

使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用copy-field指令),那么还是把它设为false,这样搜

索结果能表明哪个字段的查询文本未被找到

aseHighlighter:

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

ghtMultiTerm

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

ts:

这是highlighted片段的最大数。默认值为1,也几乎不会修改。如果某个特定的字段的该值被置为0(如ts=0),这就表明

该字段被禁用高亮了。你可能在=*时会这么用。

ze:

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

ontiguous:

如果被置为true,当snippet重叠时会merge起来。

lyzedChars:

会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1

ateField:

如果没有生成snippet(没有terms匹配),那么使用另一个字段值作为返回。

ernateFieldLength:

如果ateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值是应该为

ts*ze这样返回结果的大小就能保持一致。

ter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。

显然这不够用,你可以看看和中highlighting元素是如何配置的。

注意在不论原文中被高亮了什么值的情况下,如预先已存在的emtags,也不会被转义,所以在有时会导致假的高亮。

nter:

这个是solr制定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是

一种非典型的高级选项。为了知道默认设置和fragmenters(andformatters)是如何配置的,可以看看中的highlight段。

regex的fragmenter有如下选项:

n:正则表达式的pattern

:这是ze能变化以适应正则表达式的因子。默认值是0.6,意思是如果ze=100那么fragment的大小会从40-160.

.

分组查询:

acet

Facet字段通过在请求中加入””参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如

/select?q=联想

&facet=on

&=cpu

&=videoCard

各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独

的Facet字段.应用于单独的字段时通过

f.字段名.参数名=参数值

这种方式调用.比如参数应用于cpu字段,可以采用如下形式

=Intel

表示Facet字段值的前缀.比如”=cpu&=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”

AMD”开头的cpu型号将不会被统计在内.

表示Facet字段值以哪种顺序返回.可接受的值为true(count)|false(index,lex).true(count)表示按照count值从大到小排列.

false(index,lex)表示按照字段值的自然顺序(字母,数字的顺序)排列.默认情况下为true(count).当值为负数时,默认=

false(index,lex).

限制Facet字段返回的结果条数.默认值为100.如果此值为负数,表示不限制.

返回结果集的偏移量,默认为0.它与配合使用可以达到分页的效果.

nt

限制了Facet字段值的最小count,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.

g

默认为””,如果设置为true或者on,那么将统计那些该Facet字段值为null的记录.

取值为enum或fc,默认为fc.该字段表示了两种Facet的算法,与执行效率相关.

enum适用于字段值比较少的情况,比如字段类型为布尔型,或者字段表示中国的所有省份.Solr会遍历该字段的所有取值,并从filterCache里为

每个值分配一个filter(这里要求里对filterCache的设置足够大).然后计算每个filter与主查询的交集.

fc(表示FieldCache)适用于字段取值比较多,但在每个文档里出现次数比较少的情况.Solr会遍历所有的文档,在每个文档内搜索Cache内的

值,如果找到就将Cache内该值的count加1.

当=enum时,此参数其作用,minDf表示minimumdocumentfrequency.也就是文档内出现某个关键字的最少次数.该参数默

认值为0.设置该参数可以减少filterCache的内存消耗,但会增加总的查询时间(计算交集的时间增加了).如果设置该值的话,官方文档建议优先

尝试25-50内的值.

cet

日期类型的字段在文档中很常见,如商品上市时间,货物出仓时间,书籍上架时间等等.某些情况下需要针对这些字段进行Facet.不过时间字段的

取值有无限性,用户往往关心的不是某个时间点而是某个时间段内的查询统计结果.Solr为日期字段提供了更为方便的查询统计方式.当然,字段

的类型必须是DateField(或其子类型).

需要注意的是,使用DateFacet时,字段名,起始时间,结束时间,时间间隔这4个参数都必须提供.

与FieldFacet类似,DateFacet也可以对多个字段进行Facet.并且针对每个字段都可以单独设置参数.

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

起始时间,时间的一般格式为”1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具体格式可以参

考eld的javadoc.

结束时间.

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

意”+”因为是特殊字符所以应该用”%2B”代替.

d

取值可以为true|false,默认为false.它表示gap迭代到end处采用何种处理.举例说明start为2009-1-1,end为2009-12-25,gap为”

+1MONTH”,hardend为false的话最后一个时间段为2009-12-1至2010-1-1;hardend为true的话最后一个时间段

为2009-12-1至2009-12-25.

取值范围为before|after|between|none|all,默认为none.

before会对start之前的值做统计.

after会对end之后的值做统计.

between会对start至end之间所有值做统计.如果hardend为true的话,那么该值就是各个时间段统计值的和.

none表示该项禁用.

all表示before,after,all都会统计.

举例:

&facet=on

&=date

&=2009-1-1T0:0:0Z

&=2010-1-1T0:0:0Z

&=%2B1MONTH

&=all

返回结果:

5

1

5

+1MONTH

2010-01-01T00:00:00Z

180

5

54

uery

FacetQuery利用类似于filterquery的语法提供了更为灵活的Facet.通过参数,可以对任意字段进行筛选.

例1:

&facet=on

&=date:[2009-1-1T0:0:0ZTO2009-2-1T0:0:0Z]

&=date:[2009-4-1T0:0:0ZTO2009-5-1T0:0:0Z]

返回结果:

2009-2-1T0:0:0Z]">5

3

例2:

&facet=on

&=date:[2009-1-1T0:0:0ZTO2009-2-1T0:0:0Z]

&=price:[*TO5000]

返回结果:

2009-2-1T0:0:0Z]">5

116

例3:

&facet=on

&=cpu:[ATOG]

返回结果:

11

操作符

可以用key操作符为Facet字段取一个别名.

例:

&facet=on

&={!key=中央处理器}cpu

&={!key=显卡}videoCard

返回结果:

48

28

63

24

21

8

8

7

6

操作符和ex操作符

当查询使用filterquery的时候,如果filterquery的字段正好是Facet字段,那么查询结果往往被限制在某一个值内.

例:

&fq=screenSize:14

&facet=on

&=screenSize

返回结果:

107

0

0

可以看到,屏幕尺寸(screenSize)为14寸的产品共有107件,其它尺寸的产品的数目都是0,这是因为在filter里已经限制了screenSize:14.这

样,查询结果中,除了screenSize=14的这一项之外,其它项目没有实际的意义.

有些时候,用户希望把结果限制在某一范围内,又希望查看该范围外的概况.比如上述情况,既要把查询结果限制在14寸屏的笔记本,又想查看一

下其它屏幕尺寸的笔记本有多少产品.这个时候需要用到tag和ex操作符.

tag就是把一个filter标记起来,ex(exclude)是在Facet的时候把标记过的filter排除在外.

例:

&fq={!tag=aa}screenSize:14

&facet=on

&={!ex=aa}screenSize

返回结果:

107

40

34

发布评论

评论列表 (0)

  1. 暂无评论