我正在尝试使用范围查询创建名称(个人和机构)的字母浏览,这些查询将排序而不考虑标点符号或大小写,但即使Solr中的分析工具建议查询中的标点符号应该被正确删除,查询中存在标点符号仍会对结果产生负面影响。
来自schema.xml的:
<fieldType name="sort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="-" replacement=" "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}¿¡「」]" replacement=""/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s+" replacement=" "/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ICUFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.TrimFilterFactory" />
</analyzer>
</fieldType>
<field name="authorSort" type="sort" indexed="true" stored="true" multiValued="false" required="true"/>
来自solrconfig.xml的:
<requestHandler name="/authors" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">lucene</str>
<str name="echoParams">explicit</str>
<str name="fl">*</str>
<str name="df">authorSort</str>
<str name="sort">authorSort asc</str>
<str name="rows">20</str>
<str name="wt">ruby</str>
<str name="indent">true</str>
</lst>
</requestHandler>
我的实际查询如下:
http://myserver/solr/testCore/authors?q=["Search String" TO *]
当我搜索q=["ACA" TO *]
时,我的最高成绩是“ACA(认证档案管理员学院)”,这很好。如果我改变“ACA”中使用的大小写,我的结果不会改变,这也是好的。如果我搜索句号(q=["A.C.A." TO *]
)的首字母缩略词,我根本得不到合适的结果,而我的热门歌曲是“A3(音乐组)”。在这种情况下,我怀疑它是在整理期间而不是放弃它。
根据Solr的分析工具,“ACA”和“A.C.A.”应使用我配置的分析仪将其渲染为“aca”。我无法解释为什么这两次搜索没有实际等效。
(如果它有任何区别,索引时间分析实际上没用,因为我的代码在提交要索引的数据之前进行相同的转换。有原因。所以它只是查询时间分析让我悲伤。)
编辑:这是我对“A.C.A.”的分析截图因为查询应该有效(根据Solr分析工具)。
大约四个月后添加:
自从发布问题而没有找到决议以来,我有 切换到使用自定义过滤器工厂进行分析。这给了 我控制本来很困难的分析 不可能给出提供的过滤器。我的第一次尝试也是一样的 问题 - 分析在常规搜索中有效但未应用于 范围查询。通过添加解决了此问题
implements MultiTermAwareComponent
到我的过滤器工厂并覆盖getMultiTermComponent()
。我不知道这对一个领域有什么作用 这是使用KeywordTokenizer
,因此永远不会有多个 字段值中的术语......但它确实解决了问题。这是为了 Solr 4.2 。