#+TITLE Solr 查询

1 Search

1.1 Overview

1.1.1 输入查询语句

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

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

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

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

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

1.1.5 指定特定的条件高亮

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

1.1.7 对结果分组

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

1.1.8 MoreLikeThis

1.1.9 response writer (返回结果的形式)

  1. XML Response Writer
  2. JSON Response Writer

1.2 通用查询语句

1.2.1 defType:

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

1.2.2 sort:

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

1.2.3 start:

  • 初始位置

1.2.4 rows:

  • 相当于mysql中的limit

1.2.5 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/

1.2.6 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]

1.2.7 debug:

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

1.2.8 explainOther:

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

1.2.9 timeAllowed:

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

1.2.10 omitHeader:

  • 不返回头部信息

1.2.11 wt:

  • 返回结果的格式

1.2.12 cache=false:

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

1.2.13 logParamsList(version >= 4.7):

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

1.2.14 echoParams:

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

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

1.3 The Standard Query Parser (lucene parser)

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

1.3.1 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 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
  1. 需要转义的字符
    • - && || ! ( ) { } [ ] ^ " ~ * ? : /

1.3.2 q.op

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

1.3.3 df

指定默认搜索的字段

1.4 TODO The DisMax Query Parser

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

1.4.1 Parameters

  1. q
    • '+'/'-' 视为强制和禁止
    • 不支持通配符
  2. q.alt
    • q 参数为空或者没有指定时.执行 standard 查询,通常设置q.alt为*:*
  3. qf

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

    one is 2.3, two is default, three is 0.4
    
    qf="fieldOne^2.3 fieldTwo fieldThree^0.4"
    
  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%就可以
  5. pf (phrase fields)

    没看懂

  6. ps (Phrase Slop)

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

  7. bq (Boost Query)

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

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

1.5 The Extended DisMax Parameters

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

1.5.1 Parameters

  1. stopwords

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

1.6 Faceting

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

1.6.1 General Parameters

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

1.6.2 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 适用于值较少的

1.6.3 facet.pivot

不会翻译, 作用比较像是 mysql 中将两个字段进行分组,然后rollup,获得一个统计数据 返回字段 facet_count.facet_pivot

1.7 Highlighter

1.7.1 Standard Highlighter

Last Updated 2017-03-31 五 20:37.
Render by hexo-renderer-org with Emacs 25.1.1 (Org mode 9.0.2)