#+TITLE Solr 查询
- 解析器的种类
- Standard Query Parser (清晰)
- DisMax (很少报错)
- eDisMax (扩展版的 DisMax,完全支持 lucene 查询语法)
- common query parameters (支持全部的解析器)
- 解析器输入种类
- 查询语句
- 对查询语句的微调参数
- 对查询结果展示的控制
- Filter queries 只查询索引中存在的数据
- faceting
- facet 分组字段(对结果进行分组)
- facet count 分组得到的结果的数量
- constraints 分组得到的结果的值
- breadcrumb 面包屑(已经应用的 facet)
- list 结果详情
- clustering
- XML Response Writer
- JSON Response Writer
- 选择查询解析器
- dismax/lucene
- defType=dismax
- 对返回结果排序,asc|desc
- 可以对数字和字母排序
- 排序规则
- 根据文档相关程度排序
- 或者是根据字段的值排序,这个字段的值要么被索引要么使用了*DocValues*
- 单独字段排序:<field_name>+(asc|desc)
- 多字段排序:sort=<field name>+<direction>,<field name>+<direction>],…
- 初始位置
- 相当于 mysql 中的 limit
- 对结果过滤的条件
- 对将要返回的文档过滤(不会影响 score【猜测是相关度】)
- 对复杂的 query 进行加速,因为会对 fq 进行的查询独立进行缓存
- fq 参数可以出现多次
- `fq=popularity:[10 TO *]&fq=section:0` (当条件经常单独出现时)
- `fq=+popularity:[10 TO *] +section:0` (当条件经常单独出现时)
- url-encoding 参考地址 : http://meyerweb.com/eric/tools/dencoder/
- 设定返回结果的字段,用逗号或者空格分开
- stored=”true” or docValues=”true” or useDocValuesAsStored=”true”(在 docvalues 模式开启时是默认的)
- 字段可以是个函数 如:fl=id,title,product(price,popularity)
- 别名:fl=id,sales_price:price,secret_sauce:prod(price,popularity),why_score:[explain style=nl]
- 返回额外的调试信息。
- debug=timing 只返回时间信息.
- debug=results 返回对返回结果的每个文档的解释。
- debug=all(true)将返回所有的调试信息。debugQuery=true
- q=supervillians&debugQuery=on&explainOther=id\:juggernaut
- 返回调试信息
- 必须加上 debugQuery=on 否则不返回 debug 字段
- 超过此时间之后,只会返回一部分数据
- 不返回头部信息
- 返回结果的格式
- 停止缓存所有的查询和过滤条件的结果
- 默认会记录所有的字段,logParamsList=param1,param2 逗号分割的参数
在 response header 中的 params 字段中显示所用到的查询字段
- explicit(默认)
- all
- none
优点:直观,缺点:不能有语法错误
查询语句,强制性
http://localhost:8983/solr/techproducts/select?q=id:SP2514N q=*:* 查询全部,特殊情况
? | 匹配单个字符 |
* | 匹配多个字符 |
~ | 模糊搜索 roam~ 将会匹配 foam,foams 等 |
1 | 模糊搜索 roam 将会匹配 foam,不会匹配 foams,因为 foams 改动了两个字 | |
“jakarta apache”~10 | 两个词之间改动 10 个位置可以匹配到 |
mod_date:[20020101 TO 20030101] | 范围查询 |
title:{Aida TO Smith} | 大括号表示不包含上下边界 |
jakarta^4 apache | boost factor 可以通过改变这个值改变查询时的相关度,可以小于 1 |
(description:blue OR color:blue)^=1.0 text:shoes | 将匹配括号中的语句的文档相关度设置成 1 |
title:”The Right Way” AND text:go | 指定字段查询 |
title:”Do it right” AND go | 第二个字段直接查询默认搜索字段 |
(AND/&&),(OR/ll),(+),(-),(NOT !) | 操作符 |
+ - && ll ! ( ) { } [ ] ^ ” ~ * ? : / | 需要转义的字符 |
(jakarta OR apache) AND website | 表达式 website 存在并且有 jakarta 或者 apache |
- - && || ! ( ) { } [ ] ^ ” ~ * ? : /
指定查询语句默认是用*AND*还是*OR*
指定默认搜索的字段
dismax: maximum disjunction 目的是为了容易使用和接收大部分的参数并且不返回参数
- ’+’/’-’ 视为强制和禁止
- 不支持通配符
- q 参数为空或者没有指定时.执行 standard 查询,通常设置 q.alt 为*:*
qf 是个字段列表,每个字段都有一个增强因子,能在查询中增加或者减少字段的重要性
one is 2.3, two is default, three is 0.4 qf="fieldOne^2.3 fieldTwo fieldThree^0.4"
默认值是 100% 每个条件都必须满足
- 正数
必须有多少符合的搜索条件 (在 optional 的条件中查询)
eg): 性别:女 MUST 年龄:<25 SHOULD 胸围: >C should 收入: >10000 should 要符合两个条件才会被 hit,要不直接去掉
- 负数 必须有 (可选条件总数-此值) 个条件匹配
- 90% 可选条件总数的 90% 下取整
- -25% 表示可以缺少的条件 下取整
- 3<90% 若是 1-3 个可选,那么这 3 个是必须的,否则要总数的 90%就可以
没看懂
slop 是指两个项的位置之间允许的最大间隔距离
指定一个或者多个短语来增加分数
recip(rord(myfield),1,2,3)^1.5 bf=recip(rord(creationDate),1,1000,1000) ...or... bq={!func}recip(rord(creationDate),1,1000,1000) // 指定 bq 为函数
除了 dismax 的参数之外,还支持一些其他的参数 edismax 支持 +,OR,NOT,- 并且这几个操作符存在时,mm 会失效
选择是否启用 停用词/排除词
对结果进行分类(分组),很方便查询每个条件有多少文档。 必要条件:facet 的字段必须被索引 indexed=true
- facet=true(on) , 默认为假
- 不会改变结果字段,只会添加一个 facet_counts 字段
- facet.query 指定计算 count 的表达式 facet.query={!myfunc}name~fred
- facet.field 分组的字段
- facet.prefix 限制 facet.field 的前缀,不同则不分类
- facet.limit facet_counts 字段返回条数, 默认 100
- facet.sort
- count 根据数量排序
- index (default)
- facet.offset 开始条数,偏移量,它与 facet.limit 配合使用可以达到分页的效果
- facet.mincount facet_counts 字段中最小的数量,低于此值不显示
- facet.missing 是否返回没有值的 field
- facet.method
取值为 enum 或 fc,默认为 fc, fc 表示 Field Cache
- enum 适用于值较少的
不会翻译, 作用比较像是 mysql 中将两个字段进行分组,然后 rollup,获得一个统计数据 返回字段 facet_count.facet_pivot
- http://localhost:8983/solr/techproducts/select?q=*:*&facet.pivot=cat,popularity,inStock&facet.pivot=popularity,cat&facet=true&facet.field=cat&facet.limit=5&rows=0&wt=json&indent=true&facet.pivot.mincount=2