排序字符串字段没有正确排序

时间:2014-05-22 18:17:48

标签: sorting solr solr4

如果我对名为代码字符串字段进行排序,我会收到以下结果:

    {code:ABC-120GB}
    {code:ABC-120GBY}
    {code:ABC-120GY}
    {code:ABC-120G}
    {code:ABC-120GB}
    {code:ABC-120GBY}
    {code:ABC-120GY}

这些是schema.xml文件中提到的字段的配置:

<fields
    <field name="code" type="string" indexed="true" stored="true" required="true"/> 
</fields>

<types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
</types>

1 个答案:

答案 0 :(得分:3)

看起来code_length上的第一级排序正常。 code上的排序是否有效,如果它是指定的唯一排序?我怀疑如果它是您用于排序的唯一字段,您会在code字段上看到与排序相同的问题。

您看到的问题很可能是由我们无法看到的数据变化引起的,因为您还没有包含真实数据。有趣的是,您是否可以使用实际发布的数据或其他非敏感值重新创建此问题。首先,我怀疑字符编码中存在不可见的变化。如果是这种情况,您可以尝试将code字段修改为单令牌基于文本的字段,而不是未修改的字符串字段。然后,您可以选择要添加到该fieldType的各种过滤器,以便规范化编码变体。一个好的过滤器需要考虑ICU Folding Filter来管理大量规范化,并且可以使用以下行添加到fieldType定义中:

<filter class="solr.ICUFoldingFilterFactory"/>

你可以考虑这个名为fieldType的定义&#34; exact&#34;这可能对你有用。通过&#34;标记化&#34;将值放入一个大型令牌中,它会保留您现在使用code字段type="string"的完全匹配搜索,并且只有在排序字段上只有一个令牌才能使Solr高兴。

  <fieldType name="exact" class="solr.TextField" sortMissingLast="true" omitNorms="true">
  <analyzer>
    <!-- KeywordTokenizer does no actual tokenizing, so the entire
         input string is preserved as a single token
      -->
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.ICUFoldingFilterFactory"/>        
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
</fieldType>

然后,您将code字段定义更改为:

<field name="code" type="exact" indexed="true" stored="true" required="true" multiValued="false"/> 

当然,这有些推测,因为我无法知道我看不到的数据可能会告诉我什么,而且ICU折叠过滤器无法针对可能导致您麻烦的一切进行调整。但我希望这会有所帮助。

  • 注意:由于排序不适用于多值字段,因此我建议为计划用于排序的任何字段明确指定multiValued="false"。它不那么模棱两可。