Skip to content

Latest commit

 

History

History
251 lines (205 loc) · 9.57 KB

6-search.org

File metadata and controls

251 lines (205 loc) · 9.57 KB

#+TITLE Solr 查询

Search

Overview

输入查询语句

查询语句被 request handler 处理 (此插件定义了 solr 处理请求的逻辑)

调用 query parser (解析器解释查询的条件和参数)

  1. 解析器的种类
    1. Standard Query Parser (清晰)
    2. DisMax (很少报错)
    3. eDisMax (扩展版的 DisMax,完全支持 lucene 查询语法)
  2. common query parameters (支持全部的解析器)
  3. 解析器输入种类
    1. 查询语句
    2. 对查询语句的微调参数
    3. 对查询结果展示的控制

*filter query*(fq) (filter query 会开辟一块单独的缓存,这种策略对性能提升很大)

  1. Filter queries 只查询索引中存在的数据

指定特定的条件高亮

返回结果可以有一个小片段,像是谷歌的搜索

对结果分组

  1. faceting
    1. facet 分组字段(对结果进行分组)
    2. facet count 分组得到的结果的数量
    3. constraints 分组得到的结果的值
    4. breadcrumb 面包屑(已经应用的 facet)
    5. list 结果详情
  2. clustering

MoreLikeThis

response writer (返回结果的形式)

  1. XML Response Writer
  2. JSON Response Writer

通用查询语句

defType:

  1. 选择查询解析器
  2. dismax/lucene
  3. defType=dismax

sort:

  1. 对返回结果排序,asc|desc
  2. 可以对数字和字母排序
  3. 排序规则
    1. 根据文档相关程度排序
    2. 或者是根据字段的值排序,这个字段的值要么被索引要么使用了*DocValues*
  4. 单独字段排序:<field_name>+(asc|desc)
  5. 多字段排序:sort=<field name>+<direction>,<field name>+<direction>],…

start:

  • 初始位置

rows:

  • 相当于 mysql 中的 limit

fq:

  1. 对结果过滤的条件
  2. 对将要返回的文档过滤(不会影响 score【猜测是相关度】)
  3. 对复杂的 query 进行加速,因为会对 fq 进行的查询独立进行缓存
  4. fq 参数可以出现多次
    1. `fq=popularity:[10 TO *]&fq=section:0` (当条件经常单独出现时)
    2. `fq=+popularity:[10 TO *] +section:0` (当条件经常单独出现时)
  5. url-encoding 参考地址 : http://meyerweb.com/eric/tools/dencoder/

fl:

  1. 设定返回结果的字段,用逗号或者空格分开
  2. stored=”true” or docValues=”true” or useDocValuesAsStored=”true”(在 docvalues 模式开启时是默认的)
  3. 字段可以是个函数 如:fl=id,title,product(price,popularity)
  4. 别名:fl=id,sales_price:price,secret_sauce:prod(price,popularity),why_score:[explain style=nl]

debug:

  1. 返回额外的调试信息。
  2. debug=timing 只返回时间信息.
  3. debug=results 返回对返回结果的每个文档的解释。
  4. debug=all(true)将返回所有的调试信息。debugQuery=true

explainOther:

  • q=supervillians&debugQuery=on&explainOther=id\:juggernaut
  • 返回调试信息
  • 必须加上 debugQuery=on 否则不返回 debug 字段

timeAllowed:

  • 超过此时间之后,只会返回一部分数据

omitHeader:

  • 不返回头部信息

wt:

  • 返回结果的格式

cache=false:

  • 停止缓存所有的查询和过滤条件的结果

logParamsList(version >= 4.7):

  • 默认会记录所有的字段,logParamsList=param1,param2 逗号分割的参数

echoParams:

在 response header 中的 params 字段中显示所用到的查询字段

  1. explicit(默认)
  2. all
  3. none

The Standard Query Parser (lucene parser)

优点:直观,缺点:不能有语法错误

q

查询语句,强制性

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 apacheboost 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

需要转义的字符

  • - && || ! ( ) { } [ ] ^ ” ~ * ? : /

q.op

指定查询语句默认是用*AND*还是*OR*

df

指定默认搜索的字段

The DisMax Query Parser

dismax: maximum disjunction 目的是为了容易使用和接收大部分的参数并且不返回参数

Parameters

q

  • ’+’/’-’ 视为强制和禁止
  • 不支持通配符

q.alt

  • q 参数为空或者没有指定时.执行 standard 查询,通常设置 q.alt 为*:*

qf

qf 是个字段列表,每个字段都有一个增强因子,能在查询中增加或者减少字段的重要性

one is 2.3, two is default, three is 0.4

qf="fieldOne^2.3 fieldTwo fieldThree^0.4"

mm (Minimum Should Match) p272

默认值是 100% 每个条件都必须满足

  • 正数 必须有多少符合的搜索条件 (在 optional 的条件中查询)
    eg):
    
    性别:女  MUST
    年龄:<25  SHOULD
    胸围: >C should
    收入: >10000 should
    
    要符合两个条件才会被 hit,要不直接去掉
    
        
  • 负数 必须有 (可选条件总数-此值) 个条件匹配
  • 90% 可选条件总数的 90% 下取整
  • -25% 表示可以缺少的条件 下取整
  • 3<90% 若是 1-3 个可选,那么这 3 个是必须的,否则要总数的 90%就可以

pf (phrase fields)

没看懂

ps (Phrase Slop)

slop 是指两个项的位置之间允许的最大间隔距离

bq (Boost Query)

指定一个或者多个短语来增加分数

bf (Boost Functions)

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 为函数

The Extended DisMax Parameters

除了 dismax 的参数之外,还支持一些其他的参数 edismax 支持 +,OR,NOT,- 并且这几个操作符存在时,mm 会失效

Parameters

stopwords

选择是否启用 停用词/排除词

Faceting

对结果进行分类(分组),很方便查询每个条件有多少文档。 必要条件:facet 的字段必须被索引 indexed=true

General Parameters

  1. facet=true(on) , 默认为假
    1. 不会改变结果字段,只会添加一个 facet_counts 字段
  2. facet.query 指定计算 count 的表达式 facet.query={!myfunc}name~fred

Field-Value Faceting Parameters

  1. facet.field 分组的字段
  2. facet.prefix 限制 facet.field 的前缀,不同则不分类
  3. facet.limit facet_counts 字段返回条数, 默认 100
  4. facet.sort
    • count 根据数量排序
    • index (default)
  5. facet.offset 开始条数,偏移量,它与 facet.limit 配合使用可以达到分页的效果
  6. facet.mincount facet_counts 字段中最小的数量,低于此值不显示
  7. facet.missing 是否返回没有值的 field
  8. facet.method 取值为 enum 或 fc,默认为 fc, fc 表示 Field Cache
    • enum 适用于值较少的

facet.pivot

不会翻译, 作用比较像是 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

Highlighter

Standard Highlighter

参考文献

lucene 打分机制较复杂 solr 搜索打分规制排序 对Lucene PhraseQuery的slop的理解