如果我对名为代码的字符串字段进行排序,我会收到以下结果:
{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>
答案 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"
。它不那么模棱两可。