2013-10-12 76 views
0

在Solr的領域PackageTag的Solr - 斜面查詢特殊字符或數字

<field name="PackageTag" type="text_en_splitting" indexed="true" stored="true" required="false" multiValued="true"/> 

我有以下值

"playing @@*" 

現在我searcing爲「玩」我把它在我的結果。
但是,當我用@@ *搜索時,我沒有。 它在分隔符中被省略。

有沒有一種方法可以讓用戶搜索其特殊的字符,但仍然使用單詞分隔?

回答

0

我不記得Lucene特殊字符的列表,但是你是否嘗試在字符前用\(反斜槓)逃脫?

如果這不起作用,您可能需要查看Analyzer您正在使用的索引字段。 StandardAnalyzer可能會對你的特殊角色做一些有趣的事情,所以你可以考慮另一個分析器或者自己推出。

+0

爲了完整性,下面是Lucene特殊字符的完整列表:http://lucene.apache.org/core/2_9_4/queryparsersyntax.html#Escaping%20Special%20Characters –

0

您必須在protwords.txt文件中添加單詞分隔符字符,然後在索引和查詢時應用使用該protwords的過濾器。 (例如solr.WordDelimiterFilterFactoryprotected="protwords.txt"參數)。

通過這種方式,它們將按照您的要求進行標記,並且在查詢期間不會被刪除。

1

這裏有twoissues:

  • 首先,你必須在Solr中創建自己的字段類型,並配置它不是用戶「@」和「*」作爲索引字:

在架構.XML做這樣的事情:

<types> 
     <fieldType name="myTextFieldType" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
       <tokenizer class="solr.StandardTokenizerFactory" /> 
       <filter class="solr.StopFilterFactory" ignoreCase="true" 
        words="stopwords.txt" enablePositionIncrements="true" /> 
      </analyzer> 
      <analyzer type="query"> 
       <tokenizer class="solr.StandardTokenizerFactory" />    
       <filter class="solr.StopFilterFactory" ignoreCase="true" 
        words="stopwords.txt" enablePositionIncrements="true" /> 
      </analyzer> 
     </fieldType> 
     </types> 

然後,必須使用該字段類型爲 「PackageTag」 字段:

<field name="PackageTag" type="text_en_splitting" 
  • 然後,在「CONF」目錄(其中schema.xml中位於同一目錄),創建或編輯stopWords.txt中文件,並添加「@」和「*」來了。只要把它們放在那裏,每個字符在同一行:

    @

    *

現在,由於 「*」 字也是Lucene的查詢(通配符)的特殊字符,你需要在您的查詢中轉義它。您可以用「\*」替換「*」。類似這樣的:

PackageTag:bla\* 

搜索包含「bla *」的字段。