当 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)。
我正在尝试使用 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
...................
我遵循
<?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)。