当docvalues = true

时间:2016-09-26 07:54:02

标签: sorting solr solr4

我正在尝试使用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我也会收到上述错误?

1 个答案:

答案 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)。