Solr PostFilter优化查询性能
- - 开源软件 - ITeye博客 实际业务场景中,有时会需要两阶段过滤,最终的搜索结果是在前一个搜索结果上进一步搜索而得到的(search-within-search)的特性. 假设,最终搜索结果集是由(A AND B)两个条件对应的命中结果集求交而得到的. 如果A条件对应的文档集合非常小(大概不超过300个),而B条件对应的文档集合非常大.
提升软件性能,通常喜欢去调整各种启动参数,这没有多大意义,小伎俩。 性能优化要从架构和策略入手,才有可能得到较大的收益
Solr的查询是基于Field的,以Field为基本单元,例如一个文章站要索引
class Article
{
String title;
String content;
String tags;
}
查询参数: q=title:big && content:six
Solr会顺序执行两次 field查询 ,这个开销非常大。 实际例子 :50万条记录,一次在6,7个字段上检索,24 core的服务器也需要10-20ms
如果把title和content 合并,那只需要查询一次,性能可以提升50%
在生成索引xml的时候,把title和content填入同一个字段,就能达到这种效果,但是产生新的问问题
无法对title和content的查询分别指定权重了,一般来说,title的权重要高于content
Solr给出一种解决方法: 在schema中使用 copyField
上述的Article Schema可以写成如下这种格式,就能达到效果
<field name="title" type="text_general" indexed="true" stored="true"/> <field name="content" type="text_general" indexed="true" stored="true"/> <field name="tags" type="text_general" indexed="true" stored="true"/> <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> <copyField source="title" dest="text"/> <copyField source="content" dest="text"/> <copyField source="tags" dest="text"/>
这种schema定义方式,既可以对单个field指定查询权重,也可以在泛查询的时候提升性能,同时生成索引数据的时候不需要多写任何代码