solr 基本查询

一.基本查询php

q – 查询字符串,必须的。
fl – 指定返回那些字段内容,用逗号或空格分隔多个。
start – 返回第一条记录在完整找到结果中的偏移位置,0开始,通常分页用。
rows – 指定返回结果最多有多少条记录,配合start来实现分页。
sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt – (writer type)指定输出格式,能够有 xml, json, php, phps, 后面 solr 1.3增长的,要用通知咱们,由于默认没有打开。
fq – (filter query)过虑查询,做用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,而且date_time是20081001到20091031之间的。
java



q.op – 覆盖schema.xml的defaultOperator(有空格时用”AND”仍是用”OR”操做逻辑),通常默认指定
df – 默认的查询字段,通常默认指定
qt – (query type)指定那个类型来处理查询请求,通常不用指定,默认是standard。
正则表达式

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

indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,通常调试json,php,phps,ruby输出才有必要用这个参数。
version – 查询语法的版本,建议不使用它,由服务器指定默认值。
[Solr的检索运算符]
“:” 指定字段查指定值,如返回全部值*:*²
“?”²表示单个任意字符的通配
“*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)²
“~”²表示模糊检索,如检索拼写相似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回类似度在0.8以上的记录。
²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
“^”²控制相关度检索,如检索jakarta apache,同时但愿去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
布尔操做符AND、||²
布尔操做符OR、²&&
布尔操做符NOT、!、-²(排除操做符不能单独与项使用构成查询)
“+” 存在操做符,要求符号”+”后的项必须在文档相应的域中存在²
( ) 用于构成子查询²
² [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
{}²不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
” 转义操做符,特殊字符包括+ – & | ! ( ) { } [ ] ^ ” ~ * ? : “
算法

二.高亮


     hl-highlight,h1=true,表示采用高亮。能够用h1.fl=field1,field2 来设定高亮显示的字段。apache

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

  • hl.requireFieldMatch:
    若是置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不一样的字段。若是hl.fl使用了通配符,那么就要启用该参数。尽管如此,若是你的查询是all字段(多是使用 copy-field 指令),那么仍是把它设为false,这样搜索结果能代表哪一个字段的查询文本未被找到ruby

  • hl.usePhraseHighlighter:
    若是一个查询中含有短语(引号框起来的)那么会保证必定要彻底匹配短语的才会被高亮。服务器

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

  • hl.snippets:
    这是highlighted片断的最大数。默认值为1,也几乎不会修改。若是某个特定的字段的该值被置为0(如f.allText.hl.snippets=0),这就代表该字段被禁用高亮了。你可能在hl.fl=*时会这么用。ui

  • hl.fragsize:
    每一个snippet返回的最大字符数。默认是100.若是为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么作。

  • hl.mergeContiguous:
    若是被置为true,当snippet重叠时会merge起来。

  • hl.maxAnalyzedChars:
    会搜索高亮的最大字符,默认值为51200,若是你想禁用,设为-1

  • hl.alternateField:
    若是没有生成snippet(没有terms 匹配),那么使用另外一个字段值做为返回。

  • hl.maxAlternateFieldLength:
    若是hl.alternateField启用,则有时须要制定alternateField的最大字符长度,默认0是即没有限制。因此合理的值是应该为

  • hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。

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

  • 显然这不够用,你能够看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。
    注意在不论原文中被高亮了什么值的状况下,如预先已存在的em tags,也不会被转义,因此在有时会致使假的高亮。

  • hl.fragmenter:
    这个是solr制 定fragment算法的扩展点。gap是默认值。regex是另外一种选项,这种选项指明highlight的边界由一个正则表达式肯定。这是一种非典型 的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,能够看看solrconfig.xml中的highlight段。
    regex 的fragmenter有以下选项:

  • hl.regex.pattern:正则表达式的pattern

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

三.分组查询:

 

1.       Field Facet

Facet 字段经过在请求中加入 ”facet.field” 参数加以声明 , 若是须要对多个字段进行 Facet查询 , 那么将该参数声明屡次 . 好比

/select?q=联想

&facet=on

&facet.field=cpu

&facet.field=videoCard

各个 Facet 字段互不影响 且能够针对每一个 Facet 字段设置查询参数 如下介绍的参数既能够应用于全部的 Facet 字段 也能够应用于每一个单独的 Facet 字段 应用于单独的字段时经过

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

这种方式调用 . 

好比 facet.prefix 参数应用于 cpu 字段 , 能够采用以下形式 f.cpu.facet.prefix=Intel

1.1   facet.prefix

表示 Facet 字段值的前缀 . 好比 ”facet.field=cpu&facet.prefix=Intel”, 那么对 cpu字段进行 Facet 查询 , 返回的 cpu 都是以 ”Intel” 开头的 ,”AMD” 开头的 cpu 型号将不会被统计在内 .

1.2   facet.sort

表示 Facet 字段值以哪一种顺序返回 . 可接受的值为 true(count)|false(index,lex). true(count) 表示按照 count 值从大到小排列 . false(index,lex) 表示按照字段值的天然顺序 (字母 , 数字的顺序 ) 排列 . 默认状况下为 true(count). 当 facet.limit 值为负数时 ,默认 facet.sort= false(index,lex).

1.3   facet.limit

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

1.4   facet.offset

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

1.5   facet.mincount

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

1.6   facet.missing

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

1.7   facet.method

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

enum 适用于字段值比较少的状况 , 好比字段类型为布尔型 , 或者字段表示中国的全部省份.Solr 会遍历该字段的全部取值 , 并从 filterCache 里为每一个值分配一个 filter( 这里要求 solrconfig.xml 里对 filterCache 的设置足够大 ). 而后计算每一个 filter 与主查询的交集 .

fc( 表示 Field Cache) 适用于字段取值比较多 , 但在每一个文档里出现次数比较少的状况 .Solr 会遍历全部的文档 , 在每一个文档内搜索 Cache 内的值 , 若是找到就将 Cache 内该值的count 加 1.

1.8   facet.enum.cache.minDf

当 facet.method=enum 时 , 此参数其做用 ,minDf 表示 minimum document frequency. 也就是文档内出现某个关键字的最少次数 . 该参数默认值为 0. 设置该参数能够减小 filterCache 的内存消耗 , 但会增长总的查询时间 ( 计算交集的时间增长了 ). 若是设置该值的话 ,官方文档建议优先尝试 25-50 内的值 .

2.       Date Facet

日期类型的字段在文档中很常见 , 如商品上市时间 , 货物出仓时间 , 书籍上架时间等等 . 某些状况下须要针对这些字段进行 Facet. 不过期间字段的取值有无限性 , 用户每每关心的不是某个时间点而是某个时间段内的查询统计结果 . Solr 为日期字段提供了更为方便的查询统计方式 .固然 , 字段的类型必须是 DateField( 或其子类型 ).

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

与 Field Facet 相似 ,Date Facet 也能够对多个字段进行 Facet. 而且针对每一个字段均可以单独设置参数 .

2.1   facet.date

该参数表示须要进行 Date Facet 的字段名 , 与 facet.field 同样 , 该参数能够被设置屡次 , 表示对多个字段进行 Date Facet.

2.2   facet.date.start

起始时间 , 时间的通常格式为 ” 1995-12-31T23:59:59Z”, 另外可使用 ”NOW”,”YEAR”,”MONTH” 等等 , 具体格式能够参考 org.apache.solr.schema. DateField 的 java doc.

2.3   facet.date.end

结束时间 .

2.4   facet.date.gap

时间间隔 . 若是 start 为 2009-1-1,end 为 2010-1-1.gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 . 注意 ”+” 由于是特殊字符因此应该用 ”%2B” 代替 .

2.5   facet.date.hardend

取值能够为 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.

2.6   facet.date.other

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

before 会对 start 以前的值作统计 .

after 会对 end 以后的值作统计 .

between 会对 start 至 end 之间全部值作统计 . 若是 hardend 为 true 的话 , 那么该值就是各个时间段统计值的和 .

none 表示该项禁用 .

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

举例 :

&facet=on

&facet.date=date

&facet.date.start=2009-1-1T0:0:0Z

&facet.date.end=2010-1-1T0:0:0Z

&facet.date.gap=%2B1MONTH

&facet.date.other=all


返回结果

<lst name="facet_counts">

         <lst name="facet_queries"/>

         <lst name="facet_fields"/>

         <lst name="facet_dates">

<int name="2009-01-01T00:00:00Z">5</int>

<int name="2009-11-01T00:00:00Z">1</int>

<int name="2009-12-01T00:00:00Z">5</int>

<str name="gap">+1MONTH</str>

<date name="end">2010-01-01T00:00:00Z</date>

<int name="before">180</int>

<int name="after">5</int>

<int name="between">54</int>

</lst>

</lst>

3.       Facet Query

Facet Query 利用相似于 filter query 的语法提供了更为灵活的 Facet. 经过 facet.query 参数 , 能够对任意字段进行筛选 .

例 1:

&facet=on

&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]

&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

例2:

&facet=on

&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]

&facet.query=price:[* TO 5000]

4.       key 操做符

能够用 key 操做符为 Facet 字段取一个别名 .

例 :

&facet=on

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

&facet.field={!key=显卡}videoCard

相关文章
相关标签/搜索