侧边栏壁纸
博主头像
极客日记 博主等级

行动起来,活在当下

  • 累计撰写 93 篇文章
  • 累计创建 17 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【Solr】Solr查询语法

Jack.Jia
2022-04-04 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

查询参数

常用

  • q 查询的关键字,此参数最为重要,例如,q=id:1,默认为 q=*:*
  • fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
  • start 返回结果的第几条记录开始,一般分页用,默认 0 开始
  • rows 指定返回结果最多有多少条记录,默认值为 10,配合 start 实现分页
  • sort 排序方式,例如 id desc 表示按照 id 降序,多个字段:score desc,price asc
  • wt(writer type) 指定输出格式,有 xml, json, php, python
  • 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 查询语法的版本,建议不使用它,由服务器指定默认值。
  • q.op 覆盖 schema.xmldefaultOperator(有空格时用 "AND" 还是用 "OR" 操作逻辑),一般默认指定

检索运算符

  • : 指定字段查指定值,如返回所有值:
  • ? 表示单个任意字符的通配
  • * 表示多个任意字符的通配(不能在检索的项开始使用 * 或者 ? 符号)
  • ~ 表示模糊检索,如检索拼写类似于 roam 的项这样写:roam~ 将找到形如 foamroams 的单词;roam~0.8,检索返回相似度在 0.8 以上的记录。 邻近检索,如检索相隔 10 个单词的 apachejakarta"jakarta apache"~10
  • ^ 控制相关度检索,如检索 jakarta apache,同时希望去让 jakarta 的相关度更加好,那么在其后加上 ^ 符号和增量值,即 jakarta^4 apache
  • AND、|| 布尔操作符
  • OR、&& 布尔操作符
  • NOT、!、- 布尔操作符(排除操作符不能单独与项使用构成查询)
  • + 存在操作符,要求符号 + 后的项必须在文档相应的域中存在
  • () 用于构成子查询
  • [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
  • {} 不包含范围检索,如检索某时间段记录,不包含头尾,date:{200707 TO 200710}
  • " 转义操作符,特殊字符包括 + - && || ! ( ) { } [ ] ^ " ~ * ? : "

示例

查询所有

https://solr.explorexd.com/solr/primary/select?q=*:*

限定返回字段

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId

表示:查询所有记录,只返回 productId 字段

分页

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId&rows=6&start=0

表示:查询前六条记录,只返回 productId 字段

增加限定条件

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId&rows=6&start=0&fq=category:2002&fq=namespace:d&fl=productId+category&fq=en_US_city_i:1101

表示:查询 category=2002、en_US_city_i=110 以及 namespace=d 的前六条记录,只返回 productId
category 字段

添加排序

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId&rows=6&start=0&fq=category:2002&fq=namespace:d&sort=category_2002_sort_i+asc

表示:查询 category=2002 以及 namespace=d 并按 category_2002_sort_i 升序排序的前六条记录,只返回 productId 字段

facet 查询

实现分组统计结果

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId&fq=category:2002&facet=true&facet.field=en_US_county_i&facet.field=en_US_hotelType_s&facet.field=price_p&facet.field=heatRange_i

https://solr.explorexd.com/solr/primary/select?q=*:*&fl=productId&fq=category:2002&facet=true&facet.field=en_US_county_i&facet.field=en_US_hotelType_s&facet.field=price_p&facet.field=heatRange_i&facet.query=price_p:[300.00000+TO+*]

高亮

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

  • hl.fl: 用空格或逗号隔开的字段列表。要启用某个字段的 highlight 功能,就得保证该字段在 schema 中是 stored。如果该参数未被给出,那么就会高 亮默认字段 standard handler 会用 df 参数,dismax 字段用 qf 参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用 。
  • hl.requireFieldMatch: 如果置为 true,除非该字段的查询结果不为空才会被高亮。它的默认值是 false,意味 着它可能匹配某个字段却高亮一个不同的字段。如果 hl.fl 使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是 all 字段(可能是使用 copy-field 指令),那么还是把它设为 false,这样搜索结果能表明哪个字段的查询文本未被找到
  • hl.usePhraseHighlighter: 如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
  • hl.highlightMultiTerm 如果使用通配符和模糊搜索,那么会确保与通配符匹配的 term 会高亮。默认为 false,同时 hl.usePhraseHighlighter 要为 true
  • hl.snippets: 这是 highlighted 片段的最大数。默认值为 1,也几乎不会修改。如果某个特定的字段的该值被置为 0(如 f.allText.hl.snippets=0),这就表明该字段被禁用高亮了。你可能在 hl.fl=* 时会这么用。
  • 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.javasolrconfig.xmlhighlighting 元素是如何配置的。 注意在不论原文中被高亮了什么值的情况下,如预先已存在的 em tags,也不会被转义,所以在有时会导致假的高亮。 -hl.fragmenter: 这个是 solr 制定 fragment 算法的扩展点。gap 是默认值。regex 是另一种选项,这种选项指明 highlight 的边界由一个正则表达式确定。这是一种非典型 的高级选项。为了知道默认设置和 fragmenters (and formatters) 是如何配置的,可以看看 solrconfig.xml 中的 highlight 段。
  • hl.regex.pattern: 正则表达式的 pattern
  • hl.regex.slop: 这是 hl.fragsize 能变化以适应正则表达式的因子。默认值是 0.6,意思是如果 hlfragsize=100 那么 fragment 的大小会从 40-160.

分组

官方 wiki:http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields_and_Facet_Queries
这是 facet 的官方 wiki,里面有 facet 各个参数的详细说明。所以这里只说一些常用的。

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

Facet 主要分为:Field FacetDate Facet 两大类

Field Facet

  • facet 参数字段必须被索引
  • facet=onfacet=true
  • facet.field 分组的字段
  • facet.prefix 表示 Facet 字段前缀
  • facet.limit Facet 字段返回条数
  • facet.offict 开始条数, 偏移量, 它与 facet.limit 配合使用可以达到分页的效果
  • facet.mincount Facet 字段最小 count, 默认为 0
  • facet.missing 如果为 ontrue, 那么将统计那些 Facet 字段值为 null 的记录
  • facet.sort 表示 Facet 字段值以哪种顺序返回 . 格式为 true(count)|false(index,lex),true(count) 表示按照 count 值从大到小排列,false(index,lex)表示按照字段值的自然顺序 (字母 , 数字的顺序) 排列 . 默认情况下为 true(count)

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 时间间隔, 如果 start2015-1-1, end2016-1-1gap 设置为 +1MONTH 表示间隔 1 个月 , 那么将会把这段时间划分为 12 个间隔段 .
  • facet.date.hardend 表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔. 取值可以为 true|false, 默认为 false.

start2015-1-1, end2015-12-21, gap+1MONTH, 如果 hardendfalse,则,最后一个时间段为 2015-12-12016-1-1; 反之,如果 hardendtrue,则,最后一个时间段为 2015-12-12015-12-21.

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

0

评论区