查询运算符
例如:http://localhost:8984/solr/mycore/select?q=*:*
: 指定字段查指定值,如返回所有值q=*:*
? 匹配单个字符, 例如: q=title:??拳 可以匹配标题为“形意拳”的文档
* 匹配零个或多个字符, 例如: q=title:*形意拳 或者 q=title:*拳 都可以匹配标题为“形意拳”的文档
~ 表示模糊检索, 例如:q=title:xoodcopping~0.8 可以匹配到标题为“Woodchopping”的文档, 但是q=title:xoodcopping~0.9 就无法匹配到, ~后面的数组在0~1之间,数值越大相似度越高。
AND 与操作符,例如: q=title:形意拳 AND type:sport 可以匹配到标题为形意拳并且类型为sport的文档
OR 或操作符,例如: q=title:形意拳 OR title:悠波球 可以匹配到标题为形意拳或者悠波球的文档
NOT 非操作符, 例如: q=type:sport NOT title:悠波球 可以匹配到所有类型为sport但是标题不是悠波球的文档
! 非操作符, 例如: q=type:sport !title:悠波球 可以匹配到所有类型为sport但是标题不是悠波球的文档
- 非操作符, 例如: q=type:sport -title:悠波球 可以匹配到所有类型为sport但是标题不是悠波球的文档
+ 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
() 用于构成子查询, 例如: q=type:sport AND ( group:sport OR title:悠波球 )
[] 包含范围检索,如检索某时间段记录,包含头尾,例如: q=date:[201507 TO 201510]
{} 不包含范围检索,如检索某时间段记录,不包含头尾, 例如: q=date:{201507 TO 201510}
查询参数
q 指定查询条件, 条件项目以":"分割属性和值, 支持多个条件和子查询, 参考上面的查询运算符。
fq 过滤条件,格式同参数q,fq是在使用q参数查询完成后,再针对结果进行过滤。
sort 结果排序方式,支持desc和asc两种方式,例如:sort=score desc, price asc, sum(x_d, y_d) desc; 当不指定sort参数时,将会使用隐藏字段score进行desc排序。
start 结果偏移起始量
rows 返回结果的数量,配合start参数可实现分页的查询
fl Field List,指定返回结果中包含的字段, 默认返回除score等隐藏字段之外的所有字段,等同于fl=*,返回指定字段例如:fl=name, age
df Default Field 默认查询的字段,如果在q中没有指定字段,例如:q=michael 的时候指定默认的字段 df=name, 等同于q=name:michael
wt 响应的数据格式,支持格式:csv,geojson,javabin,json,php,phps,python,ruby,smile,velocity,xlsx,xml,sxlt
命令行操作
启动solr服务器
# solr start -p 8984
创建core
# solr create_core -c mycore
常用操作
增加文档
<add> <doc> <field name="id">1</field> <field name="name">四格</field> <field name="introduction">最长在家半年的死宅,三周热度,三天打鱼两天晒往</field> </doc> </add> <commit/>
问题
Solr中的q与fq参数的区别在那儿?
原文链接:http://www.highersoft.net/html/notice/notice_311.html
今天遇到一个问题,把相同的参数比如name:张三,放到q与fq,两者返回的结果完全不一样。
经过debug发现,原因是这两个参数是solr查询的不同阶段使用的,所以结果不一样。
如果用于q。那么,就会查所有name中包含"张三"的,然后order by score,这时就会按name的相似度来排序。
而如果用fq,q设置为*:*。那么solr会先order by score,而因为条件是*:*,所以所有文档的相关性都是一样的,所以即使用fq过滤了,返回的最前面的却不是相关性最高的。
综上所述,以相关性(score)为优先排序条件的,那么条件一定放在q参数中。