1. 基本查询概念
1.1 字段查询
首先假设我的数据里 fields 有:name, tel, address
预设的搜寻是 name 这个字段,如果要搜寻的数据刚好就是 name 这个字段,就不需要指定搜寻字段名称。
1.2 查询规则
如欲查询特定字段(非预设字段),请在查询词前加上该字段名称加 “:” 符号,例如:
address:北京市海淀区上地软件园
tel:88xxxxx1
1.3 查询参数说明
- q 代表 query input
- version 代表 solr 版本(建议不要变动此变量)
- start 代表显示结果从哪一笔结果资料开始,预设为 0 代表第一笔
- rows 是说要显示几笔数据,预设为 10 笔
因为有时查询结果可能有几百笔,但不需要显示所有结果,所以预设是从第一笔开始到第十笔。
所以若要显示第 10 到 30 笔就改为:
1 | http://localhost:8080/solr/select/?indent=on&version=2.2&q=address:北京市海淀区上地软件园+tel:88xxxxx1&version=2.2&start=10&rows=20&indent=on |
(indent 代表输出的 xml 要不要缩行,预设为开启 on)
1.4 输出字段限定
要限定输出结果的内容可用 “fl=” 加上你要的字段名称,如以下这个范例:
1 | http://localhost:8080/solr/select/?indent=on&version=2.2&q=text:北京+OR+text:亿度&start=0&rows=10&fl=name,address,tel |
在 fl= 之后加上了 name, address, tel
2. 查询参数
常用参数
- 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 - 查询语法的版本,建议不使用它,由服务器指定默认值。
3. Solr 的检索运算符
基本运算符
- “:” 指定字段查指定值,如返回所有值
*:*
- “?” 表示单个任意字符的通配
- “*” 表示多个任意字符的通配(不能在检索的项开始使用 * 或者 ? 符号)
- “~” 表示模糊检索,如检索拼写类似于 “roam” 的项这样写:
roam~
将找到形如 foam 和 roams 的单词;roam~0.8
,检索返回相似度在 0.8 以上的记录。
邻近检索
如检索相隔 10 个单词的 “apache” 和 “jakarta”:"jakarta apache"~10
相关度控制
“^” 控制相关度检索,如检索 jakarta apache,同时希望去让 “jakarta” 的相关度更加好,那么在其后加上 “^” 符号和增量值,即 jakarta^4 apache
布尔操作符
- AND、&& 布尔操作符 AND
- OR、|| 布尔操作符 OR
- NOT、!、- 布尔操作符 NOT(排除操作符不能单独与项使用构成查询)
- “+” 存在操作符,要求符号 “+” 后的项必须在文档相应的域中存在
- ( ) 用于构成子查询
范围查询
- [ ] 包含范围检索,如检索某时间段记录,包含头尾:
date:[200707 TO 200710]
- { } 不包含范围检索,如检索某时间段记录,不包含头尾:
date:{200707 TO 200710}
时间范围查询示例
1 | timestamp:[* TO NOW] |
转义操作符
“" 转义操作符,特殊字符包括:
1 | + - & ! ( ) { } [ ] ^ " ~ * ? : \ |