Solr.config配置文件中的Solr requestHandler SearchComponent和QueryResponseWriter
config/requestHandler : solrCore用来配置RequestHandler,转发给请求指明的handler去处理
config/queryParser : solrCore用来配置QueryParser
config/queryResponseWriter : solrCore用来配置QueryResponseWriter,如果查询有指定输出格式则到配置的QueryResponseWriter里查,没有则用默认的
config/searchComponent : solrCore用来配置SearchComponent给RequestHandler用的
config/listener : solrCore用来配置相关事件LISTENER
config/directoryFactory : solrCore用来配置DirectoryFactory
config/mainIndex/deletionPolicy : solrCore用来配置IndexDeletionPolicy
config/indexReaderFactory : solrCore用来配置IndexReaderFactory
config/updateRequestProcessorChain : solrCore用来配置UpdateRequest处理责任链
加载UpdateHandlerInfo,使用updateHandler/ @class,updateHandler/autoCommit/maxDocsupdateHandler/autoCommit/maxTime,updateHandler
/commitIntervalLowerBound实例化一个UpdateHandlerInfo : solrCore用来配置这个core的UpdateHandler
SolrRequestHandler
可以自己定义,这个方法自己实现的话很难重用该类,并且需要继承standardRequestHandler,还有就是定义一个searchComponent的新功能给
requestHandler使用,requestHandler可以将这些searchComponent的组件链接起来,形成一个新的SolrRequestHandler
SearchComponent通常有:
QueryComponent
http://localhost:8983/solr/select?&q=iPod&start=0&rows=10
,
FacetComponent
http://localhost:8983/solr/select?&q=iPod&start=0&rows=10&facet=true&facet.field=inStock
MoreLikeThisComponent http://localhost:8983/solr/select?&q=iPod&start=0&rows=10&mlt=true&mlt.fl=features&mlt.count=1
HighlightComponent
http://localhost:8983/solr/select?&q=iPod&start=0&rows=10&hl=true&hl.fl=name
DebugComponent
http://localhost:8983/solr/select?&q=iPod&start=0&rows=10&debugQuery=true
SpellCheckComponent
http://localhost:8983/solr/spellCheckCompRH?&q=iPood&start=0&rows=10&spellcheck=true&spellcheck.build=true
默认情况下,所有 SolrRequestHandler
都附带有 QueryComponent
、FacetComponent
、MoreLikeThisComponent
、HighlightComponent
和DebugComponent
。要添加自己的组件,
您需要:
假定我创建了一个名为 com.grantingersoll.MyGreatComponent
的 SearchComponent
,并让 Solr 可以使用它,而现在我想要将其插入到SolrRequestHandler
中以查询它。那么我
首先需要声明该组件,如清单 2 所示,这样 Solr 才能知道如何实例化这个类:
<searchComponent name="myGreatComp" class="com.grantingersoll.MyGreatComponent"/>
显式地声明所有 SearchComponent
:
<requestHandler name="/greatHandler" class="solr.SearchHandler">
<arr name="components"> <str>query</str> <str>facet</str> <str>myGreatComp</str> <str>highlight</str> <str>debug</str> </arr> </requestHandler>
预先将组件添加到现有的链接上
<requestHandler name="/greatHandler" class="solr.SearchHandler"> <arr name="first-components"> <str>myGreatComp</str> </arr> </requestHandler>
将组件追加到现有链接上
<requestHandler name="/greatHandler" class="solr.SearchHandler"> <arr name="last-components"> <str>myGreatComp</str> </arr> </requestHandler>
现在,与 SearchComponent
重构类似,也可以将查询解析和 SolrRequestHandler
分开。因此,您可以把DismaxQParser
与任何 SolrRequestHandler
一起使用。您可以通过输入
defType
参数来实现:http://localhost:8983/solr/select?&q=iPod&start=0&rows=10&defType=dismax&qf=name
使用 Dismax 查询解析器来解析查询,而不是标准 Lucene 查询解析器
您也可以通过扩展 QParser
和 QParserPlugin
来创建您自己的查询解析器,并让 Solr 可以使用它们,然后在 solrconfig.xml 中配置它。例如,如果我创建了
com.grantingersoll.MyGreatQParser
和 com.grantingersoll.MyGreatQParserPlugin
,并使让 Solr 可以使用它们,那么我应该在 solrconfig.xml 中按以下方式配置它们
queryParser name="greatParser" class="com.grantingersoll.MyGreatQParserPlugin"/>
随后,我可以将 defType=greatParser
键 / 值对添加到一个查询请求中,以查询这个新的解析器
MySearchHandler extends StandardRequestHandler 定制RequestHandler
MyResponseWriter implements QueryResponseWriter
MySearchComponent extends SearchComponent 定制SearchComponent
主要就是在prepare()里获取到SolrQueryRequest里的查询query,在process()里自己处理,并且获取到前一次component处理得到的SolrQueryResponse,里面可
能会有已经排好序的查询数据集,你也可以做一些二次处理,简单过滤,重新排序等事情
自定义field type:ExampleFieldType extends SortableIntField ,将ExampleFieldType.class 放入目录webapps/solr/WEB-INF/classes/pl/solr
使用:<fieldtype name="example" class="pl.solr.ExampleFieldType" /> <field name="price" type="example" indexed="true" stored="true"/>
参考:http://blog.csdn.net/zhangshuliai/article/details/8022744
MoreLikeThisHandler查找相似商品,使用
MoreLikeThisComponent
(MLT),参数mlt,mlt.count,mlt.fl,mlt.maxqt
例如:http://localhost:8983/solr/rss/select/?q=solr&version=2.2&start=0&rows=10 &indent=on&mlt=true&mlt.fl=description&mlt.fl=title&mlt.count=3
提供拼写建议:首先,模式必须先声明一个 Field
和一个相关联的、其内容能够发挥拼写词典的作用的 FieldType
。按常规,该FieldType
的分析过程要保持简单,而且不要派
生词语或修改其他标志。我的样例 FieldType
声明了它的 <analyzer>
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" > <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter
class="solr.LowerCaseFilterFactory"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> </fieldType>
该 <analyzer>
负责基本的标志化(尤其是拆分空格),然后将标志变成小写并移除复制。不用派生词语,也不用扩展同义词。就是这么简单。接下来我在 schema.xml 文件中
声明了一个 field
,名为 spell
,它使用 textSpell <fieldType>
。接着,我声明了<searchComponent>
,将 solrconfig.xml 文件中的必要的部分连接起来,
<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <str name="queryAnalyzerFieldType">textSpell</str> <lst name="spellchecker"> <str
name="name">default</str> <str name="field">spell</str> <str name="spellcheckIndexDir">./spellcheckerDefault</str> </lst> </searchComponent>
http://localhost:8983/solr/rss/select/?q=holr&spellcheck=true
再深入一步,多个词语的查询也可以使用拼写检查。组件甚至能够自动地创建一个推荐的新查询,该查询将所有词语的最佳建议结合起来。这可以通过添加
spellcheck.collate=true
参数来实现。就像在错误拼写查询中一样,http://localhost:8983/solr/rss/select/?q=holr+foo&spellcheck=true&indent=on &spellcheck.collate=true
它生成了作为建议的一部分的结果 <str name="collation">solr for</str>
。但是要注意,这个合并的结果可能不会返回结果,这取决于您是否用AND
将查询词语连接起来
另外,拼写检查器还能采用与返回的建议数量和结果质量有关的查询参数。要想更多地了解 SpellCheckComponent
的详细信息,spellings.txt也可以指定自定义的词组
编辑结果顺序
Solr 使用一个神秘命名的 SearchComponent
(即 QueryElevationComponent
)实现了简单排名。为了在样例应用程序中配置它,
<searchComponent name="elevator" class="org.apache.solr.handler.component.QueryElevationComponent" > <!-- pick a fieldType to analyze queries --> <str
name="queryFieldType">string</str> <str name="config-file">elevate.xml</str> </searchComponent>
queryFieldType
属性指定如何将传入的查询与要提升的查询相匹配。为简单起见,string FieldType
意味着查询必须是一个精确匹配的字符串,因为在string FieldType
上是
不会执行任何分析的。config-file
属性指定包含查询和相关联的结果的文件。它储存在一个单独的文件中,这样才能够从外部编辑它。文件必须位于 Solr 配置目录中或 Solr
数据目录中。如果它不在数据目录中,那么它会在 Solr 需要重新装载索引时再载入。
样例应用程序将 elevate.xml 储存在配置目录中
<query text="sony">
<doc id="000037" /> <!-- put the actual ipod at the top -->当搜索sony的时候将000037放在第一位,并将006621排除在外
<doc id="006621" exclude="true" /> <!-- exclude this cable -->
</query>
http://localhost:8983/solr/rss/select/?q=Solr&version=2.2&start=0&rows=10&indent=on &fl=link&enableElevation=false
<requestHandler name= "/elevate" class = "solr.SearchHandler" startup= "lazy" ><arr name="last-components">
<str>elevator</str>
</arr>
高亮(highlight)请求中需要两个参数"hl=true"和"hl.fl=name",前者开启高亮,后者告诉需要高亮的name字段,也可以对多个字段进行高亮,可以添加多个字段,字段间逗号隔开
如hl.fl=name,name2,name3
http://localhost:8080/solr/select?q=name:王麻子&start=0&rows=10&hl=true&hl.fl=name