当 docvalues=true 时,小写过滤器工厂不起作用

Lowercase filter factory doesn't work when docvalues=true

我正在尝试使用 Solr 实现不区分大小写的排序并面对

[已复制]

....But When I get search result its not sorted case insensitive. It gives all camel case result first and then all lower case

If I m having short names

Banu

Ajay

anil

sudhir

Nilesh

It sorts like Ajay, Banu, Nilesh, anil, sudhir
...................

我遵循 并在我的 solr schema.xml 文件中进行了以下更改(仅显示相关字段和字段类型):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<schema name="autoSolrSchema" version="1.5">
 <types>
  ...............
  <fieldType class="org.apache.solr.schema.TextField" name="TextField">
   <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
   </analyzer>
  </fieldType>
  .............
 </types>
 <fields>
 .................
  <field indexed="true" multiValued="false" name="name" stored="true" type="TextField" docValues="true" />
 ................ 
 </fields>
 <uniqueKey>id</uniqueKey>
 </schema>

但这并没有解决排序问题。所以我 从字段定义中删除了 docValues="true" 并再次尝试。这次排序工作正常,但我必须在查询中指定 useFieldCache=true

为什么 solr.LowerCaseFilterFactory 不能与 docValues="true" 一起使用?

是否有任何其他方法可以在不删除 docValues="true" 和指定 useFieldCache=true 的情况下进行不区分大小写的排序?

更新:

我听从了 ericLavault 的建议并实施了更新请求处理器。但现在我面临以下问题:

1) 我们正在使用 dse 搜索。所以按照this article.

中指定的方法

我们当前的 table 架构:

CREATE TABLE IF NOT EXISTS test_data(
    id      UUID,   
    nm      TEXT,   
    PRIMARY KEY (id)

Solr 架构:

 Solr schema :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<schema name="autoSolrSchema" version="1.5">
 <types>
  <fieldType class="org.apache.solr.schema.UUIDField" name="UUIDField"/>
  <fieldType class="org.apache.solr.schema.StrField" name="StrField"/>
 </types>
 <fields>
  <field indexed="true" multiValued="false" name="nm" stored="true" type="StrField" docValues="true"/>
  <field indexed="true" multiValued="false" name="id" stored="true" type="UUIDField"/>
  <field indexed="true" multiValued="false" name="nm_s" stored="true" type="StrField" docValues="true"/>
 </fields>
 <uniqueKey>id</uniqueKey>
</schema>

按照建议,我使用更新请求处理器将 nm 转换为小写字母并插入为 nm_s。然后重新加载架构并重新编制索引。但是在查询时使用这个 select nm from test_data where solr_query='{"q": "(-nm:(sssss))" ,"paging":"driver","sort":"nm_s asc"}';

我收到以下错误:

...enable docvalues true n reindex or place useFieldCache=true...

2) 如何确保值 nm_s 正确更新?有什么办法可以看到nm_s的值吗?

3) 为什么即使启用了 docValues 也会出现上述错误?

这个问题可能是因为 DocValues 最初是为了支持未分析的类型而设计的。不支持 TextField :

DocValues are only available for specific field types. The types chosen determine the underlying Lucene docValue type that will be used. The available Solr field types are:

  • StrField and UUIDField :
    • If the field is single-valued (i.e., multi-valued is false), Lucene will use the SORTED type.
    • If the field is multi-valued, Lucene will use the SORTED_SET type.
  • Any Trie* numeric fields, date fields and EnumField.
    • If the field is single-valued (i.e., multi-valued is false), Lucene will use the NUMERIC type.
    • If the field is multi-valued, Lucene will use the SORTED_SET type.

(引自https://cwiki.apache.org/confluence/display/solr/DocValues

在 Solr Jira 上添加对 TextField 的 docValues 支持的问题 (SOLR-8362),但仍然打开且未分配。


要在不删除 docValues="true" 的情况下进行不区分大小写的排序,您将不得不使用字符串字段类型 (solr.StrField),但由于您无法定义任何 <analyser>字符串类型,您将需要一个 Update Request Processor 来小写输入流(或等同于在将数据发送到 Solr 之前预处理字段内容)。

如果您希望您的字段被标记化以使用 DocValues 进行搜索 排序,您可以根据您的实际文本使用 copyField字段(没有 DocValues)和一个要排序的字符串字段(处理为小写并启用 DocValues)。