2013-06-25 62 views
0

我正在索引具有大型文本內容字段的文檔。大多數情況下,我想對這些數據以及傳入的查詢進行特殊處理。 (我目前的字段類型定義在底部)。在Solr查詢時選擇查詢分析器

但是,有時候,就像用戶傳入某些引號時,我希望使用與爲該字段定義的查詢分析器不同的查詢分析器。也許使用KeywordTokenizerFactory而不是WhitespaceTokenizerFactory,這樣我就可以匹配「短語中的多個單詞」,而不會將它們分開。

如何在查詢時選擇不同的查詢分析器?

據我所知,我可以使用copyField並設置一個完全不同的字段定義,但這基本上將我用於Solr索引的空間加倍,這是不可行的。

<fieldType name="text_en_splitting_reversed" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <!-- convert things like é to e and ŕ to r --> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <!-- Case insensitive stop word removal. 
     add enablePositionIncrements=true in both the index and query 
     analyzers to leave a 'gap' for more accurate phrase queries. 
    --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="lang/stopwords_en.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnNumerics="1" splitOnCaseChange="1" types="word-delim-types.txt" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" 
     maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/> 
</analyzer> 
    <analyzer type="query"> 
    <!-- convert things like é to e and ŕ to r --> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="lang/stopwords_en.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" types="word-delim-types.txt" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    </analyzer> 
</fieldType> 
+0

你必須有一個不同的字段和切換使用用於根據來自用戶的查詢不同的分析qt的PARAM請求處理程序。另外,將這些字段標記爲存儲爲false,這樣存儲對您來說不是一個很大的開銷,並且這些字詞將在整個索引中共享。 – Jayendra

+0

@Jayendra謝謝,我會試驗這個。我仍然擔心空間使用,因爲在我當前的領域,我已經存儲= false,索引是4GB。另外,由於這個其他索引主要用於引用的短語,因此當用戶想要進行更精確的匹配時會更頻繁地使用這個索引,您是否對該字段定義有任何建議? –

回答

1

它實際上可以動態地改變使用的分析儀,但它需要一些自定義代碼。請查看http://www.slideshare.net/treygrainger/semantic-multilingual-strategies-in-lucenesolr中的slide 30,Trey正在討論如何使用此方法來支持多語言字段的不同分析器。他的方法必須爲索引和查詢分析做到這一點,而對於您來說,這只是查詢。

Here's the JIRA feature request that Trey is referencing.

+0

謝謝,我編輯了你的答案,直接鏈接到有問題的文檔。 –