Solr为不同的fieldType配置Similarity
2015-11-06 00:04
375 查看
Similarity
业务需要,想对不同的field使用不同的similarity。继承DefaultSimilarity
实现里面的方法,重写了tf, idf,toString这三个方法,直接在schema中替换就可以对不同的field使用不同的similarity
在schema中可以设置similarity,发现不太行,solr4.2并不支持这么细粒度的similarity用法,不过可以支持不同的fieldType用不同的Similarity,如下:<types> <fieldType name="text_dfr" class="solr.TextField"> <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/> <similarity class="solr.DFRSimilarityFactory"> <str name="basicModel">I(F)</str> <str name="afterEffect">B</str> <str name="normalization">H2</str> </similarity> </fieldType> <fieldType name="text_ib" class="solr.TextField"> <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/> <similarity class="solr.IBSimilarityFactory"> <str name="distribution">SPL</str> <str name="lambda">DF</str> <str name="normalization">H2</str> </similarity> </fieldType> ... </types> <similarity class="solr.BM25SimilarityFactory"/>
其他field我想用其他的similarityFactory,例如原生的DefaultSimilarityFactory,但是重启tomcat以后报错:“org.apache.solr.common.SolrException: FieldType ‘content’ is configured with a similarity, but the global similarity does not support it: class org.apache.solr.search.similarities.DefaultSimilarityFactory
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:466)”
排查了一下原因,找到如下文档:
stackoverflow地址
mail-archives.apache地址
就是如果自己要对不同的fieldType配置不同的similarity,那么全局就要指定一个
<similarity class="solr.SchemaSimilarityFactory"/>
如果不指定该Factory,那么就会默认用DefaultSimilarityFactory替代,因为在SchemaSimilarityFactory中默认使用的similarity就是DefaultSimilarity。但是这里如果还是瞎比使用其他没有实现SchemaAware接口的SimilarityFactory就会报上面的错误。
SchemaSimilarityFactory的代码如下:
public class SchemaSimilarityFactory extends SimilarityFactory implements SchemaAware { private Similarity similarity; private Similarity defaultSimilarity = new DefaultSimilarity(); @Override public void inform(final IndexSchema schema) { similarity = new PerFieldSimilarityWrapper() { @Override public Similarity get(String name) { FieldType fieldType = schema.getFieldTypeNoEx(name); if (fieldType == null) { return defaultSimilarity; } else { Similarity similarity = fieldType.getSimilarity(); return similarity == null ? defaultSimilarity : similarity; } } }; } @Override public Similarity getSimilarity() { assert similarity != null : "inform must be called first"; return similarity; } }
所以如果想在外部使用其他Similarity的话,需要重新定义一个SimilarityFactory继承SimilarityFactory并且实现SchemaAware接口,在里面把自己的Similarity设置成defaultSimilarity即可。
相关文章推荐
- solr定时实时重建索引和增量更新
- 泛型List<T>方法属性
- CountDownLatch用法
- 绝大部分 Android 手电筒应用需要大量权限
- 这些看似合法的 iPhone Lightning 数据线将劫持您的电脑
- xml文件配置报错问题
- 每日安全资讯:保险公司以“网络战”为由拒绝为网络攻击理赔
- angular 指令简述
- Android自定义Chronometer实现短信验证码秒表倒计时功能
- Linux命令每天必学(55)之traceroute命令
- Linux Shell 脚本编程入门教程
- APS.NET MVC4生成二维码简单解析
- 灵活掌握asp.net中gridview控件的多种使用方法(上)
- 灵活掌握asp.net中gridview控件的多种使用方法(下)
- Windows下为Python安装Matplotlib模块
- PHP正则表达式之捕获组与非捕获组
- 使用PHP similar text计算两个字符串相似度
- PHP中SSO Cookie登录分析和实现
- golang sync.WaitGroup解决goroutine同步
- 在sqlserver中如何使用CTE解决复杂查询问题