2016-09-10 91 views
0

是否可以查詢SOLR中有特殊字符的數字?Apache Solr - 查詢帶特殊字符的數字

我有一個字段score它可以有小數百分比像35.49%104.18%

我需要查詢本場greater thanless than運營商。我曾嘗試使用WordDelimiterFilterFactory並創建了一個像這樣的新自定義字段。

<fieldType name="alphaNumericSort" class="solr.TextField" sortMissingLast="false" omitNorms="true"> 
     <analyzer> 
      <!-- KeywordTokenizer does no actual tokenizing, so the entire 
       input string is preserved as a single token 
      --> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <!-- The LowerCase TokenFilter does what you expect, which can be 
       when you want your sorting to be case insensitive 
      --> 
      <filter class="solr.WordDelimiterFilterFactory" 
        generateWordParts="1" 
        generateNumberParts="1" 
        catenateWords="0" 
        catenateNumbers="0" 
        catenateAll="0" 
        preserveOriginal="1" 
        types="lang/delim-types.txt" /> 
      <filter class="solr.LowerCaseFilterFactory" /> 
      <!-- The TrimFilter removes any leading or trailing whitespace --> 
      <filter class="solr.TrimFilterFactory" /> 
      <!-- Left-pad numbers with zeroes --> 
      <filter class="solr.PatternReplaceFilterFactory" 
        pattern="(\d+)" replacement="00000$1" replace="all" 
        /> 
      <!-- Left-trim zeroes to produce 6 digit numbers --> 
      <filter class="solr.PatternReplaceFilterFactory" 
        pattern="0*([0-9]{6,})" replacement="$1" replace="all" 
        /> 
      <!-- Remove all but alphanumeric characters --> 
      <filter class="solr.PatternReplaceFilterFactory" 
        pattern="([^a-z0-9])" replacement="" replace="all" 
        /> 
     </analyzer> 
    </fieldType> 

文件DELIM-types.txt的內容是

%=> ALPHA

但是,當我這樣的查詢,

- score:[* TO 100.00] 

一點也沒有不會返回任何結果。難道我做錯了什麼?

+0

當你說「可以有」時 - 該領域還有什麼其他價值?與使用TextField相比,使用雙字段和處理字段將是最有效的,並且會給出正確的結果,在這種情況下,詞法排序會給您帶來不可思議的結果。 – MatsLindh

+0

它只能有小數百分比;沒有其他的 – Deadfish

回答

1

首先 - 我會避免命名場得分,因爲這也將是Solr的內部用來指文檔的得分字段名稱(在fl參數或在sort

執行搜索後

您現有的鏈嘗試通過填充數字使文本字段/ strfield排序工作到完全相同的長度。正則表達式替換過濾器將刪除任何不是數字的,所以3.3和3.30將被視爲不同的數字。

更好的實現方法是使用數字字段。如果你可以接受雙字段的不準確,TrieDoubleField可能是最好的選擇。

刪除%可以完成in an update processor。使用該RegexReplaceProcessor可以再商量(這些在solrconfig.xml定義):

<updateRequestProcessorChain name="remove_percent"> 
    <processor class="solr.RegexReplaceProcessorFactory"> 
     <str name="fieldName">score_own</str> 
     <str name="pattern">%</str> 
     <str name="replacement"></str> 
     <bool name="literalReplacement">true</bool> 
    </processor> 
    <processor class="solr.LogUpdateProcessorFactory" /> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

然後,您可以參考此更新處理器無論是包括在您的更新請求的URL update.chain=remove_percent,或通過與參數,使Solr的配置requestHandler調用它自動地(見Configuring a custom chain as a default on the Update Request Processors wiki page

<initParams path="/update/**"> 
    <lst name="defaults"> 
     <str name="update.chain">remove_percent</str> 
    </lst> 
</initParams> 

或通過requestHandler的定義:

<requestHandler ... > 
    <lst name="defaults"> 
     <str name="update.chain">remove_percent</str> 
    </lst> 
</requestHandler> 
+0

這種方法將存儲在solr之前擺脫'%'字符?我不希望發生這種情況 – Deadfish

+0

您可以將編號存儲在兩個不同的字段中 - 一個就像沒有編制索引的StrField一樣,另一個字段用於實際查詢。使用'copyField'指令將內容移動到兩個字段中。 – MatsLindh