我正在尝试使用Solr实现不区分大小写的排序并面对this issue。
[复制]
....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
...................
我跟着the solution并在我的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.
中指定的方法我们当前的表架构:
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转换为lowecase并使用更新请求处理器作为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我也会收到上述错误?
答案 0 :(得分:2)
此问题可能源于DocValues
最初旨在支持未分析类型的事实。它不支持TextField
:
DocValues仅适用于特定字段类型。类型 选择确定将存在的基础Lucene docValue类型 用过的。可用的Solr字段类型为:
- StrField和UUIDField:
- 如果字段是单值的(即多值为false),Lucene将使用SORTED类型。
- 如果该字段是多值的,Lucene将使用SORTED_SET类型。
- 任何Trie *数字字段,日期字段和EnumField。
- 如果字段是单值的(即多值为假),Lucene将使用NUMERIC类型。
- 如果该字段是多值的,Lucene将使用SORTED_SET类型。
(引自https://cwiki.apache.org/confluence/display/solr/DocValues)
Solr Jira上存在一个问题,即为TextField(SOLR-8362)添加docValues支持,但仍然打开和取消分配。
要在不删除docValues="true"
的情况下进行不区分大小写的排序工作,您必须使用字符串字段类型(solr.StrField
),但由于您无法定义任何<analyser>
在字符串类型中,您需要Update Request Processor来小写输入流(或者等等,比如在将数据发送到Solr之前预处理字段内容)。
如果您希望将字段标记为使用DocValues排序的搜索和,则可以根据实际文本字段(不包含DocValues)和字符串使用 copyField 要排序的字段(已处理为小写且启用了DocValues)。