solr查询参数说明
常用
- q —— 查询字符串,必须的。
- fl —— 指定返回哪些字段内容,用逗号或空格分隔多个。
- start —— 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
- rows —— 指定返回结果最多有多少条记录,配合start来实现分页。
- sort —— 排序,格式:sort = <field name> + <desc|asc>[,<fieldname>+<desc|asc>]...。示例:(inStock desc,price asc)表示先“inStock”降序,再“price”升序,默认是相关性降序。
注:排序字段只能针对数值型如:int,double等。
- wt —— (write type)指定输出格式,可以有xml,json,php,phps,后面solr 1.3增加的,要用通知我们,因为默认没有打开。
- fq —— (filter query)过滤查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是2008到20091031之间的。
不常用
- 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:[201707 TO 201710]
- {} 不包含范围检索,如检索某时间段记录,不包含头尾,date:{200707 TO 200710}
注:范围检索字段只适用于:String,int,double,date,不能用于long类型的字段。
- | 转义操作符,特殊字符包括+ - && || ! () {} [] ^ " ~ * ? : \
solr查询的一些常用语法
- 首先假设我的数据里fields有:name,tel,address预设的搜索是name这个字段,如果要搜寻的数据刚好就是name这个字段,就不需要指定搜寻字段名称。
- 查询规则:
如欲查询特定字段(非预设字段),请在查询词前加上该字段名称加“:”(不包含"号)符号,例如:address:北京市海淀区上地软件园 tel:88xxxxx1
- q 代表 query input。
- version 代表solr版本(不建议不要变动此变量)。
- start代表显示结果从哪一笔结果资料开始,预设位0代表第一笔,rows是说要显示几笔数据,预设为10笔(因为有时查询结果可能有几百笔,但不需要显示所有结果,所以预设是从第一笔开始到第十笔),所以若要显示第10到30笔就改为:
http://localhost:8080/solr/select/?indent=on&version=2.2.&q=address:北京市海淀区上地软件园+tel:88xxxxx1&version2.2&start=10&rows=20&indent=on(indent代表输出的xml要不要缩进,预设位开启on)。
- 另外,要限定输出结果的内容可用“fl=”加上你要的字段名称,如以下这个范例:
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,所以结果会如下:
<result name = "response" numFound = "1340" start = "0">
<doc>
<str name = "name">北京亿度</str>
<str name = "address">北京市海淀区上地软件园</str>
<str name = "tel">88xxxxxx1</str>
</doc>
<doc>
<str name = "name">北京亿度</str>
<str name = "address" />
<str name = "tel">88xxxxxx1</str>
</doc>
</result>
- 查询name或address:直接输入查询词,如:亿度,送出的内容即为:name:亿度 AND address:海淀
- 若要搜寻联集结果:请在词与词间空格或加上大写“OR”(不包含"号)。例如:text:海淀 OR text:亿度 或 text:海淀 OR 亿度 或 海淀 亿度 或 name:亿度 OR tel:88xxxxxx1 或 name:亿度 tel:88xxxxxx1
- 若要搜寻交集结果:请在词与词间加上大写“AND” 或 "+"(不包含"号)。例如:text:海淀 AND 亿度 或 +text:海淀 +text:亿度 或 name:亿度 AND tel:88xxxxxx1或 name:(+亿度 +海淀)。
- 排除查询:在要排除的词前加上“-”(不包含"号)号,例如:海淀 -亿度,搜索结果不会有包含亿度的词的结果在内。
- Group搜寻:使用“()”来包含一个group,如希望搜寻在店名字段内同时有“台北”(不包括"号)及“火车站”(不包含"号)。
- 增加权重:如要搜寻“北京 加油站”(不包含"号)但因为回传太多笔资料内有“中华”(不包含"号)或“加油站”(不包含"号)的结果,所以想要把有包含“加油站”(不包含"号)的数据往前排,可使用"^"(不包含"号)符号在后面加上愈增加的权重数,像是“2”,则可以这样做:北京 加油站^2,会同时搜寻含有北京或加油站的结果,并把加油站这个词加权,所以搜寻时会先判断加油站这一个词在搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加会有优先权。查询时在查询词后加上“^”(不包含"号)再加上权重分数,例如:亿度 AND "北京"^2 或 亿度^2 OR 北京。
- Wildcard 搜寻使用“*”符号:如果输入“中国*银(不包含"号)”,结果会有中国信托商业银行,中国输出入银行图书阅览室,中国商银证券、中国及银之间可夹任何长短字词。