solr入门——solr基础及经常使用查询

1.solr介绍

1.1 solr是什么

Solr是构建在Apache的Lucene之上独立的企业级搜索应用服务器。对外提供相似REST风格的Web Services,用户能够经过http请求发送指定格式文件到Solr服务器生成索引、更新索引,也能够经过http提出查询请求并获得指定格式返回结果。java

1.2 solr不是什么

  • Solr不是Google或Baidu这样的网络搜索引擎
  • Solr不具有网站搜索引擎优化的功能

2. solr配置文件

solr主要配置文件包括schema.xml、solrconfig.xml等。schema主要定义了solr文档结构,若是将solr比做数据库,schemal就相似于表结构正则表达式

schemal

schemal.xml在solr中的位置如上图所示,咱们在将文档上传到solr服务器中,或者更新文本文档时,会经过文本分析器对上传的文本进行分析,将分析的结果创建索引存放在lucene中。schemal中定义了字段类型、字段名称、索引分析器,查询分析器等信息提供给文本分析使用。算法

2.1 schemal构成

schema2 Schema构成数据库

  • Fields元素,定义文档字段
  • Types元素,定义字段类型
  • 其余元素,其余设定uniqueKey、copyField

2.2 fields properties

schema3

  • 包括普通字段和动态字段
  • 字段属性解释:
    • name:字段名称,大小写敏感
    • type:字段类型
    • indexed:是否建立索引只有index=true 的字段才能作facet.field的字段,同时只有index=true该字段才能当作搜索的内容,固然store=true或者false不要紧,将不须要被用于搜索的,而只是做为结果返回的field的indexed设置为false
    • stored:field字段值是否存储,若是你设置stored=false,就算你有符合的数据看不到该field
    • multiValued:是否多值字段
  • 其余特殊字段如:_version_用于避免并发冲突

2.3 field types

schema4 Types元素apache

Solr内置了经常使用的字段类型包括:json

  • 字符串字段(string)
  • 数值字段(int,float,long,double,tint,tfloat,tlong,tdouble)
  • 日期字段(date,tdate)
  • 自定义高级字段类型

常见高级字段类型包括索引分析器和查询分析器,而分析器一般由分词器、中止词过滤器、同义词过滤器、词元转换过滤器构成缓存

3. solr查询控制台

Solr提供了丰富的基于http协议的接口,同时也提供了方便的管理控制台,经过控制台咱们能够很便捷的管理solr core、查看solr运行日志、查询、分析等。服务器

基本查询参数:q、fq、sort、(start、rows)、fl、df、Raw Query Parameters、wt、indent、debugQuery、dismax、edismax、hl、facet、spatial、spellcheck网络

3.1 q(query)

查询表达式 q=<fieldName>:<searchVal>并发

  1. 必备词 kw:海尔 + 空调 kw:海尔 AND 空调 kw:海尔 && 空调
  2. 可选词 kw:海尔 OR 空调 kw:海尔 || 空调
  3. 词项邻近度 kw:“海尔空调”~2 匹配:海尔变频空调
  4. 字符邻近度 kw:ihpone~1 匹配:iphone
  5. 排除词项 kw:海尔 兄弟 不匹配: 海尔兄弟
  6. 区间搜索 闭区间age:[0 TO 100] 0-100 开区间age:{0 TO 100} 1-99
  7. 通配符搜索 * 1个或多个 ? 1个
  8. 权重表达式 海尔空调^10
  9. 特殊字符转义 +-&&||!(){}[]^"~*?:/ 我&&你=>我&&你

3.2 fq(filter query)

fq为过滤词,非必选,可有多个值

关闭缓存

fq={!cache false} id:111

过滤顺序

添加执行成本,执行成本越低越先执行,成本大于等于100的过滤器被solr视为后置过滤器

fq={!cost=1}category:电器
fq={!cost=2}onsale:1
fq={!cost=100}star:[5 TO 9]

q和fq的区别

  1. 应用场景q通常是用户输入的关键字如keyword:海尔空调 fq通常是其余过滤条件如category:电器 onsale:1

  2. 参数个数 q参数必选有且只有1个 fq参数可选且能够有多个如:

fq=category:电器&fq=onsale:1

结果等价于

fq=category:电器 AND onsale:1

可是缓存不一样上边的写法solr会分别缓存category:电器onsale:1的结果

  1. 对得分的影响 q影响搜索结果评分 fq不会影响搜索结果的评分

3.3 其余

排序

id ASC, cmmdtyName DESC

start,rows

分页开始索引,每页条数

fl(field list)

字段列表

wt(writer type)

响应格式

wt=json

debugQuery

调试模式

debugQuery=true

dismax 析取最大化查询解析器

edismax

扩展析取最大化查询解析器

高亮

hl-highlighth1=true,表示采用高亮。能够用h1.fl=field1,field2 来设定高亮显示的字段。

  • hl.fl:用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。若是该参数未被给出,那么就会高 亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可使用星号去方便的高亮全部字段。若是你使用了通配符,那么要考虑启用 。
  • hl.requireFieldMatch:若是置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不一样的字段。若是hl.fl使用了通配符,那么就要启用该参数。尽管如此,若是你的查询是all字段(多是使用 copy-field 指令),那么仍是把它设为false,这样搜索结果能代表哪一个字段的查询文本未被找到
  • hl.usePhraseHighlighter:若是一个查询中含有短语(引号框起来的)那么会保证必定要彻底匹配短语的才会被高亮。
  • hl.highlightMultiTerm 若是使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
  • hl.snippets: 这是highlighted片断的最大数。默认值为1,也几乎不会修改。若是某个特定的字段的该值被置为0(如f.allText.hl.snippets=0),这就代表该字段被禁用高亮了。你可能在hl.fl=*时会这么用。
  • hl.fragsize: 每一个snippet返回的最大字符数。默认是100.若是为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么作。
  • hl.mergeContiguous: 若是被置为true,当snippet重叠时会merge起来。
  • hl.maxAnalyzedChars: 会搜索高亮的最大字符,默认值为51200,若是你想禁用,设为-1
  • hl.alternateField: 若是没有生成snippet(没有terms 匹配),那么使用另外一个字段值做为返回。
  • hl.maxAlternateFieldLength: 若是hl.alternateField启用,则有时须要制定alternateField的最大字符长度,默认0是即没有限制。因此合理的值是应该为hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。
  • hl.formatter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。显然这不够用,你能够看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml 中highlighting元素是如何配置的。 注意在不论原文中被高亮了什么值的状况下,如预先已存在的em tags,也不会被转义,因此在有时会致使假的高亮。 - - - hl.fragmenter:这个是solr制定fragment算法的扩展点。gap是默认值。regex是另外一种选项,这种选项指明highlight的边界由一个正则表达式肯定。这是一种非典型 的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,能够看看 solrconfig.xml 中的highlight段。
  • hl.regex.pattern:正则表达式的pattern
  • hl.regex.slop:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是若是 hlfragsize=100 那么fragment的大小会从40-160.

参考连接

https://blog.csdn.net/wangdong5678999/article/details/80508599

相关文章
相关标签/搜索