2012-08-16 57 views
6

我使用的solr建議組件具有以下配置:動態字段選擇爲Solr的建議(拼寫檢查)的多個術語的查詢

schema.xml中

<fieldType name="textSpell" class="solr.TextField"> 
<analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 
<field name="image_memo" type="text_general"/> 
<field name="username" type="text_general"/> 
<field name="image_memo" type="text_general"/> 
<field name="image_text" type="text_general"/> 
<!-- More fields included here --> 
<field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/> 
<copyField source="*" dest="spell"/> 

solrconfig.xml中

<searchComponent class="solr.SpellCheckComponent" name="suggest"> 
    <lst name="spellchecker"> 
     <str name="name">suggest</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
     <str name="field">spell</str> 
     <str name="buildOnCommit">true</str> 
    </lst> 
</searchComponent> 

<requestHandler class="org.apache.solr.handler.component.SearchHandler" 
    name="/suggest"> 
    <lst name="defaults"> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">suggest</str> 
     <str name="spellcheck.onlyMorePopular">true</str> 
     <str name="spellcheck.count">6</str> 
     <str name="spellcheck.collate">true</str> 
     <str name="spellcheck.collateExtendedResults">true</str> 
     <str name="spellcheck.collate">true</str> 
     <str name="spellcheck.maxCollations">6</str> 
     <str name="spellcheck.maxCollationTries">1000</str> 
     <str name="spellcheck.extendedResults">true</str> 
     <str name="spellcheck.collateParam.mm">100%</str> 
    </lst> 
    <arr name="components"> 
     <str>suggest</str> 
     <str>query</str> 
    </arr> 
</requestHandler> 

正如你可以看到有一個字段spell至於我用於建議查詢。 即使對於多項查詢,這種方法也很有用。

但我需要的是僅在選定的字段上進行搜索。
因此,例如我只需要有效的建議字段image_memousername 用戶可以動態添加和刪除字段進行搜索。

我知道我可以做這樣的事情:

Q =(image_memo:*搜索*或image_username:*搜索*)

但這是,如果你dramtically放緩有很多字段和多項查詢。

實施例:在搜索中字段memo, username, field, field1 and field2term, term1 and term2.

((備忘錄:術語或用戶名:術語 OR字段:術語 OR FIELD1:術語 OR FIELD2:術語 )和(備註:term1或用戶名:term1或者字段:term1 OR FIELD1:TERM1 OR FIELD2:TERM1)AND(備忘錄:TERM2 OR 用戶名:TERM2 OR字段:TERM2 OR FIELD1:TERM2 OR FIELD2:TERM2))

有什麼辦法可以動態選擇spell這個字段。或者有什麼方法可以只在多值字段中搜索特定字段

我正在使用Apach Solr 4 Alpha。

+0

你可以發佈哪些解決方案爲你工作,我看到你沒有接受給定的答案。在這種情況下,你可以發佈答案。我面臨着類似的挑戰。謝謝 – nish 2013-11-26 12:20:26

回答

0

您只需要使用DismaxeDismax。 SpellcheckComponent使用查詢參數自動運行每個建議。

所以,你要查詢像這樣:

/suggest?q={!dismax}term1 term2 term3&qf=memo username field field1 field2 

/suggest?q=term1 term2 term3&defType=dismax&qf=memo username field field1 field2 

您可以實現自定義的QueryParser,如果你不想使用(E)dismax。