我正在尝试使用范围查询创建名称(个人和机构)的字母浏览,该查询将在不考虑标点符号或大小写的情况下进行排序,但即使 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”和“ACA”都应该使用我配置的分析器渲染为“aca”。我无法解释为什么这两个搜索实际上并不等效。
(如果有任何区别,索引时间分析实际上是无用的,因为我的代码在提交要索引的数据之前进行相同的转换。这是有原因的。所以只有查询时间分析让我感到悲伤.)
编辑:这是我对“ACA”作为查询的分析应该如何工作的屏幕截图(根据 Solr 分析工具)。
大约四个月后添加:
由于发布问题并没有找到解决方案,我已切换到使用自定义过滤器工厂进行分析。这使我能够控制在提供过滤器的情况下很难或不可能进行的分析。我的第一次尝试遇到了同样的问题 - 分析在常规搜索中有效,但不适用于范围查询。通过添加
implements MultiTermAwareComponent
到我的过滤器工厂并覆盖getMultiTermComponent()
. 我不知道这对使用的字段有什么作用KeywordTokenizer
,因此在字段值中永远不会有多个术语......但它确实解决了问题。这是针对 Solr 4.2的。