Solr 查询语法

2019-03-27 01:20|来源: 网路

由于 Solr 内部实现查询语句的语法语义分析使用比较成熟的工具 Javacc,所以 Solr 支持的查询语法还是很丰富的,Solr 查询语法可以总结如下:

Solr 查询无论是 Solrj 操作还是直接发送请求给 Solr 服务器,原理都是一样的,本质上都是发送 http 请求给 Solr 服务器,不过与 Solrj 操作 Solr 服务器不同,Solr 查询可以按照各种各样的形式返回结果,比如重要的 Json 格式,可以实现 Ajax 动态显示数据效果。

首先说一下 Solr 查询语法的特点(就是普通的 get 请求,k=v)

一、当 k 是 q 的时候,表示查询条件,具体我们来看看这个 k 的 v 怎么写?
假设我们已经为三个 filed (name,addr,tel,time)建立了索引,我们应该怎么查询我们想要的数据呢?

1:指定域查询 域名:加上查询条件(比如 name:clebeg)

也可以指定全部 用关键词 all

二 、查询参数

常用

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之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters
不常用

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

转自:http://my.oschina.net/u/1244232/blog/162771

相关问答

更多
  • 我不知道为什么这不工作,但这是逻辑上相同的,它的工作: -(myField:superneat AND -myOtherField:somethingElse) 也许这与在查询中定义相同的字段两次有关 尝试在solr-user组中询问,然后在这里发回最后的答案! I don't know why that doesn't work, but this one is logically equivalent and it does work: -(myField:superneat AND -myOther ...
  • 我找到了解决方案:当我执行否定查询时,我必须写: *:* - 对于我的问题,解决方案是: time:90000 OR (time:* -time:[1521 TO *] AND (time:* -(time:[* TO 1519] OR time:[1521 TO *]))) I found the solution: when I perform a negative query, I must write: *:* - For my issue, the solution i ...
  • 这些DB服务器的用途不同,它在很大程度上取决于您的应用程序(以及您存储的数据类型)是否应该仅使用Solr或MySQL。 MySQL可以很好地存储具有大量关系和表格的数据(彼此相关的表格)。 Solr很适合文本搜索(正如你所说:快速索引),如果你没有很多“相关数据”,你确实可以将这些数据存储在相同的文档中。 有些人确实只使用Solr来存储他们的数据库...但我仍然认为RDBM可以很好地用于某些类型的数据。 例如:如果您想允许快速搜索系统用户并存储他们的完整个人资料,以及一些信息详细信息......最好使用So ...
  • 经过大量的努力,我发现现在没有工具可以解析FAST ESP查询到Solr查询(语法方面)。 我必须发展自己的。 听说Solr开发团队正在尝试开发一种能够做到这一点的工具。 同时,您将不得不等待,或开发自己的工具。 在测试了我开发的那个 - 我将它发布供公众使用。 After a lot of effort, I found out there is no tool for now that can parse FAST ESP queries to Solr queries (syntax wise). I ...
  • 您在每个查询中都给出了参数rows=2147483647 。 该参数的含义是(取自参考文献) 您可以使用rows参数对查询中的结果进行分页。 该参数指定Solr应一次返回客户端的完整结果集中的最大文档数。 默认值为10.也就是说,默认情况下,Solr一次返回10个文档以响应查询。 因此,您告诉Solr生效,在单个响应中发送查询的所有匹配。 这是你糟糕表现的原因。 当查询“java”时 ,谷歌是否会向您发送所有500.000.000次匹配,不会。 为什么不,性能。 我知道的每一个IR应用程序都会为您提供一个带 ...
  • 首先,我认为Solr通配符比“1或多个”更好地归纳为“0或多个”。 我怀疑这是你问题的根源。 (例如,请参阅WildcardQuery的javadoc 。) 其次,你是否在使用词干,因为我的第一个猜测是你正在处理一个词干问题。 Solr通配符在词干方面可能表现得很奇怪。 这是因为通配符扩展是通过搜索存储在倒排索引中的术语列表来进行的; 这些术语将以词干形式出现(可能类似“gatorad”),而不是来自原始源文本(可能是“gatorade”或“gatorades”)的单词。 例如,假设你有一个词干分析器,把“ ...
  • 除了新功能之外,Solr 3.6和Solr 4.0之间是否有任何重大差异? 我发现这个问题很奇怪,至少可以说。 错误修复和新功能是发布的全部内容! 您可以在此处查看 Solr版本的完整更新日志。 不要忘记Solr和Lucene是一致发布的,所以你还需要在两个项目中寻找相关的变化。 我可以安全地使用我在Solr 4.0中的现有查询(在Solr 3.6中工作的查询)吗? 查询应该没问题,但索引 - 可能不是。 引用另一篇SO帖子中的 javanna: 索引格式已更改,但Solr将负责升级索引。 一旦用旧索引启动 ...
  • 问过solr-user组。 以下是Chris Hostetter的回答: 问题是你试图在没有任何引用的情况下将查询嵌套在彼此内部的方式 - 解析器没有表明“b”参数是if(exists(query({!v='user_type:ADMIN'})),10,1)它认为它是"if(exists(query({!v='user_type:ADMIN'" ,其余的混淆了它)。 如果你引用“b”参数到boost解析器,它应该工作... http://localhost:8983/solr/select?q={!boos ...
  • 您确定要在架构中使用的列的类型是: 并不是: Did you make sure the type of the column you are using in your ...
  • 你不应该逃避括号和其他特殊字符\ 您的实际搜索字符串是: date_day_tdt:\[2015\-09\-01T00\:00\:00Z\ TO\ 2015\-09\-01T23\:59\:59Z\] 提示1:直接使用您的查询。 浏览器或solr客户端API将正确地转义字符: date_day_tdt:[2015-09-01T00:00:00Z TO 2015-09-01T23:59:59Z] 提示2:将echoParams = all追加到查询中。 然后解析的参数被打印在solr结果中。 You sh ...