1

我正在尝试使用范围查询创建名称(个人和机构)的字母浏览,该查询将在不考虑标点符号或大小写的情况下进行排序,但即使 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的。

4

0 回答 0