2010-01-12 78 views
20

如何在不區分大小寫的表單中創建字符串字段的副本?我想使用典型的「字符串」類型和不區分大小寫的類型。該類型定義,像這樣:如何在SOLR中創建字符串字段的大小寫敏感副本?

<fieldType name="string" class="solr.StrField" 
     sortMissingLast="true" omitNorms="true" /> 

    <!-- A Case insensitive version of string type --> 
    <fieldType name="string_ci" class="solr.StrField" 
     sortMissingLast="true" omitNorms="true"> 
     <analyzer type="index"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/>   
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

而且像這樣的領域的例子:

<field name="destANYStr" type="string" indexed="true" stored="true" 
    multiValued="true" /> 
<!-- Case insensitive version --> 
<field name="destANYStrCI" type="string_ci" indexed="true" stored="false" 
    multiValued="true" /> 

我嘗試使用CopyField像這樣:

<copyField source="destANYStr" dest="destANYStrCI" /> 

但是,顯然CopyField被稱爲在調用任何分析器之前,在source和dest上,所以儘管我已經通過分析器指定dest是不區分大小寫的,但是仍然保留從源字段複製的值的情況。

我希望能避免重新傳輸從客戶端的字段中的值,達到創紀錄的創建時間。

回答

45

沒有SO的答案,我在SOLR用戶名單中跟進。我發現,即使考慮到copyField的效果,我的string_ci字段也沒有像預期的那樣工作。艾哈邁德·阿爾斯蘭解釋了爲什麼 「string_ci」 字段應該使用solr.TextField而不是solr.StrField:

從Apache的Solr的-1.4.0 \例子\ Solr的\的conf \ schema.xml中:

「StrField類型不會被分析,但會逐字索引/存儲。」

「solr.TextField允許指定爲一個標記和標記篩選器列表,自定義文本儀的規範。」

我舉了一個例子,他自己做了一些調整和稍微的調整,下面的字段定義似乎有效,現在CopyField也按預期工作。

<fieldType name="string_ci" class="solr.TextField" 
     sortMissingLast="true" omitNorms="true"> 
     <analyzer> 
      <tokenizer class="solr.KeywordTokenizerFactory"/>   
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

destANYStrCI字段將保存一個保存的值,但會提供一個不區分大小寫的字段進行搜索。 CAVEAT:不區分大小寫的通配符搜索無法完成,因爲通配符短語繞過查詢分析器,並且在匹配索引之前不會被小寫。這意味着通配符短語中的字符必須小寫以匹配。

+0

很好的回答。特別是omitNorms是有用的,以節省內存。 – 2017-01-31 12:10:34

5

是的。 LowerCaseFilterFactory不適用於字符串數據類型。我們只能在文本字段上應用LowerCaseFilterFactory。

如果你嘗試做這樣

<!-- Assigning customised data type --> 
<field name="language" type="text_lower" indexed="true" stored="true" multiValued="false" default="en"/> 

<!-- Defining customised data type for lower casing. --> 
<fieldType name="text_lower" class="solr.String" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

這是行不通的,我們必須使用文本字段。

嘗試這種方式,它應該工作。只需將字段類型更改從StringTextField

<!-- Assigning customised data type --> 
 
<field name="language" type="text_lower" indexed="true" stored="true" multiValued="false" default="en"/> 
 

 
<!-- Defining customised data type for lower casing. --> 
 
<fieldType name="text_lower" class="solr.TextField" positionIncrementGap="100"> 
 
    <analyzer type="index"> 
 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
 
    <filter class="solr.LowerCaseFilterFactory"/> 
 
    </analyzer> 
 
    <analyzer type="query"> 
 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
 
    <filter class="solr.LowerCaseFilterFactory"/> 
 
    </analyzer> 
 
</fieldType>

+1

這不是回答問題。您無法使用文本字段進行排序。有時你需要字符串 – 2016-10-09 03:12:27

+0

最好的選擇是在字符串字段上創建自己的包裝,並將過濾分析器添加爲小寫字母。 – 2016-12-01 06:17:30

相關問題