2011-09-21 26 views
6

我正在使用SOLR 3.2。我的應用程序針對文本字段類型在SOLR實例上發佈搜索查詢。如何讓SOLR返回像「book」,「bookshelf」,「bookasd」等結果,當用戶發出像「book」這樣的查詢時。我應該手動追加「*」字符到查詢字符串,還是在SOLR中有一個設置,所以默認情況下它會在字段上進行前綴搜索?如何配置SOLR,以便用戶可以默認進行前綴搜索?

這是文本字段類型schema.xml中部分:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

您是否找到答案? –

回答

0

你要麼必須通過在搜索字詞的末尾追加通配符做在客戶端的處理。

的影響: -

  1. 通配符查詢會影響性能
  2. 通配符查詢不進行分析。所以查詢時間分析將不會適用於您搜索條件

另一種選擇是實現自定義查詢分析器與您需要的處理。

1

我對一個項目有同樣的要求。我必須執行建議。我所做的就是確定這個建議者的字段類型

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

我用ShingleFilterFactory,因爲我需要得到的一個或多個單詞組成的建議。

然後我用faceting查詢來獲取建議。

Facet.Limit = 10

Facet.Prefix = 「書」

Facet.Field = 「建議者」 //這是與字段類型= 「建議者」領域中,我保存數據

我知道它使用方面的結果,但它可能會解決您的問題。

如果我或Jayendra Patil's answer不會向您提供一個解決方案,您還可以看看EdgeNGramFilterFactory

0

我嗯,你現在已經明白了這一點,但這裏有一個答案:

我處理了這一點,通過把最後一個術語加上一個OR加上一個通配符,例如「我最喜歡的書」變成「我最喜歡的+(書或書*)」,並且會返回「我最喜歡的書架」。無論如何,你可能想要對輸入進行一些處理(轉義等)。

如果您正在尋找輸入的文本以匹配結果的開頭,那麼邊緣n-gram是要走的路,但是通過閱讀您的問題,您似乎並沒有真正要求這樣做。

相關問題