Solr是构建在Apache的Lucene之上独立的企业级搜索应用服务器。对外提供相似REST风格的Web Services,用户能够经过http请求发送指定格式文件到Solr服务器生成索引、更新索引,也能够经过http提出查询请求并获得指定格式返回结果。java
solr主要配置文件包括schema.xml、solrconfig.xml等。schema主要定义了solr文档结构,若是将solr比做数据库,schemal就相似于表结构正则表达式
schemal.xml在solr中的位置如上图所示,咱们在将文档上传到solr服务器中,或者更新文本文档时,会经过文本分析器对上传的文本进行分析,将分析的结果创建索引存放在lucene中。schemal中定义了字段类型、字段名称、索引分析器,查询分析器等信息提供给文本分析使用。算法
Schema构成数据库
Types元素apache
Solr内置了经常使用的字段类型包括:json
常见高级字段类型包括索引分析器和查询分析器,而分析器一般由分词器、中止词过滤器、同义词过滤器、词元转换过滤器构成缓存
Solr提供了丰富的基于http协议的接口,同时也提供了方便的管理控制台,经过控制台咱们能够很便捷的管理solr core、查看solr运行日志、查询、分析等。服务器
基本查询参数:q、fq、sort、(start、rows)、fl、df、Raw Query Parameters、wt、indent、debugQuery、dismax、edismax、hl、facet、spatial、spellcheck网络
查询表达式 q=<fieldName>:<searchVal>并发
+
空调 kw:海尔 AND
空调 kw:海尔 &&
空调OR
空调 kw:海尔 ||
空调~2
匹配:海尔变频空调~1
匹配:iphone–
兄弟 不匹配: 海尔兄弟[0 TO 100]
0-100 开区间age:{0 TO 100}
1-99*
1个或多个 ?
1个^10
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的区别
应用场景q
通常是用户输入的关键字如keyword:海尔空调
fq通常是其余过滤条件如category:电器 onsale:1
参数个数 q
参数必选有且只有1个 fq
参数可选且能够有多个如:
fq=category:电器&fq=onsale:1
结果等价于
fq=category:电器 AND onsale:1
可是缓存不一样上边的写法solr会分别缓存category:电器
和onsale:1
的结果
q
影响搜索结果评分 fq
不会影响搜索结果的评分排序
id ASC, cmmdtyName DESC
start,rows
分页开始索引,每页条数
fl(field list)
字段列表
wt(writer type)
响应格式
wt=json
debugQuery
调试模式
debugQuery=true
dismax 析取最大化查询解析器
edismax
扩展析取最大化查询解析器
hl-highlight
,h1=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,若是你想禁用,设为-1hl.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
:正则表达式的patternhl.regex.slop
:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是若是 hlfragsize=100 那么fragment的大小会从40-160.https://blog.csdn.net/wangdong5678999/article/details/80508599