简短版本:
有人知道EdgeNGramFilterFactory和solr5是否发生了什么事吗?它过去在solr 4上工作得很好,但是我刚刚升级到solr5,使用这个过滤器的内核拒绝加载.
说来话长:
此配置用于solr4.10 (schema.xml):
<field name="NAME" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="PP" type="text_prefix" indexed="true" stored="false" required="false" multiValued="false"/>
<copyField source="NAME" dest="PP">
<fieldType name="text_prefix" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldType>文档说我做得对(没有明确提到是solr4还是solr5)。
但是,当我试图使用此配置添加集合时,该集合将失败,其中包含以下消息:
<lst name="failure">
<str>
org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException:Error from server at http://localhost:8983/solr: Error CREATEing SolrCore 'test_collection': Unable to create core [test_collection] Caused by: Unknown parameters: {side=front}</str>
</lst>我删除了side=front“未知”参数,它从零开始工作-意味着不再有错误。
因此,虽然它过去适用于solr4而不作任何额外的更改,但是对于solr5,它不再起作用了。有什么改变吗?我错过了任何关于这个过滤器的医生吗?有什么额外的库我需要加载才能完成吗?
最后,如果上面的内容是这样的(bug/feature/任何东西)--是否有任何解决办法来实现这种“侧子字符串”索引功能,而无需我在向solr添加文档时生成值?
Update:使用“黑客”模式(即没有side=front),我对文档进行了索引,并将PP字段更改为要存储。当我搜索时,它看起来像是索引整个值。例如,对于NAME:ELEPHANT,我找到了PP:ELEPHANT ..。
发布于 2015-03-03 05:12:38
在版本4.4中的side上下文中,这个属性是已被移除。这个过滤器现在的行为总是像您在side="front"中所做的那样。因此,您可能只是删除该属性,并没有问题,因为您正在使用它的“前沿”。
你可以在有关Lucene问题的对话中读到
如果你需要反向的n-克,你总是可以添加一个过滤器,这样做之后。没有必要在此过滤器中将其作为单独的逻辑。我们应该分裂逻辑,保持过滤器尽可能简单。
这就是我们所做的。side属性已从筛选器中删除。
这是在Lucene做的,而不是直接在Solr。因为Lucene是一个Java,所以已经提到了在过滤器的Java中。
从Lucene4.4开始,这个过滤器不支持EdgeNGramTokenFilter.Side.BACK (您可以先使用ReverseStringFilter,然后再使用ReverseStringFilter获得相同的行为),正确处理补充字符,不再更新偏移量。
这可能是您在Solr文档中找不到关于它的一个字的原因。但在Lucene的变更日志中也提到了这一变化。
https://stackoverflow.com/questions/28807427
复制相似问题