2014-01-29 49 views
1

我是Solr的初學者。我正在使用Solr 4.6和Spring 3.xSpring數據Solr如何獲得建議

我已經成功地將Solr配置到我的Spring應用程序,並且能夠使用下面的代碼搜索地址。

@Query("text:*?0*") 
public List<AddressDocument> findAll(String searchText); 

我的架構是

<fields> 
    <field name="id" type="long" indexed="true" stored="true" required="true" multiValued="false" /> 
    <field name="name" type="string" indexed="false" stored="true" required="true" multiValued="false"/> 
    <field name="number" type="string" indexed="false" stored="true" required="true" multiValued="false"/> 
    <field name="address" type="text_general" indexed="false" stored="true" required="true" multiValued="false"/> 
    <field name="city" type="string" indexed="false" stored="true" multiValued="false"/> 
    <field name="state" type="string" indexed="false" stored="true" multiValued="false"/> 
    <field name="zipcode" type="string" indexed="false" stored="true" multiValued="false"/> 
    <field name="country" type="string" indexed="false" stored="true" multiValued="false"/> 
    <field name="latlng" type="string" indexed="false" stored="true" multiValued="false"/> 
    <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> 
    <field name="_version_" type="long" indexed="true" stored="true"/> 
</fields> 

<!-- Configure unique key --> 
<uniqueKey>id</uniqueKey> 
<copyField source="name" dest="text"/> 
<copyField source="number" dest="text"/> 
<copyField source="address" dest="text"/> 
<copyField source="city" dest="text"/> 
<copyField source="state" dest="text"/> 
<copyField source="zipcode" dest="text"/> 
<copyField source="country" dest="text"/> 

現在我已經集成了拼寫檢查,當我輸入任何不正確的拼寫那麼就說明我按照測井響應。

例如,正確的城市名稱是Fargo,如果我輸入Frgo,那麼它會在輸出下方顯示我。

2014-01-30 04:09:10,903 DEBUG [http-8080-2] (DirectSolrSpellChecker.java:179) - getSuggestions: [frgo] 
2014-01-30 04:09:10,940 DEBUG [http-8080-2] (SpellCheckCollator.java:180) - Collation: text:*fargo* will return 3 hits. 
2014-01-30 04:09:10,941 INFO [http-8080-2] (SolrCore.java:1864) - [customer_site_address] webapp=null path=/select params={q=text%3A*frgo*&start=0&rows=0} hits=0 status=0 QTime=43 
2014-01-30 04:09:10,944 DEBUG [http-8080-2] (SolrTemplate.java:326) - Executing query 'q=text%3A*frgo*&start=0&rows=1' against solr. 
2014-01-30 04:09:10,951 DEBUG [http-8080-2] (DirectSolrSpellChecker.java:179) - getSuggestions: [frgo] 
2014-01-30 04:09:10,959 DEBUG [http-8080-2] (SpellCheckCollator.java:180) - Collation: text:*fargo* will return 3 hits. 
2014-01-30 04:09:10,960 INFO [http-8080-2] (SolrCore.java:1864) - [customer_site_address] webapp=null path=/select params={q=text%3A*frgo*&start=0&rows=1} hits=0 status=0 QTime=15 
2014-01-30 04:09:10,961 DEBUG [http-8080-2] (AbstractMessageConverterMethodProcessor.java:150) - Written [[]] as "application/json;charset=UTF-8" using [org.springf[email protected]1fb032d] 

正如你可以看到記錄它建議正確的單詞,但我不知道我怎樣才能使用@Query或任何其它註釋這個建議。

我做了很多谷歌,但沒有找到任何完美的解決方案。

+0

請分享您的投票理由 –

回答

2

拼寫檢查結果可以使用SolrTemplage.execute收集。

final String query = "foo"; //any value to be used in solr query 

SpellcheckedPage<ExampleSolrBean> page = solrTemplate.execute(new SolrCallback<SpellcheckedPage<ExampleSolrBean>>() { 

    @Override 
    public SpellcheckedPage<ExampleSolrBean> doInSolr(SolrServer solrServer) throws SolrServerException, IOException { 
     SolrQuery q = new SolrQuery("name:"+query); 

     ModifiableSolrParams params = new ModifiableSolrParams() { 
      { 
       add("spellcheck.build", "true"); 
       add("spellcheck.q", query); 
       add("spellcheck", "true"); 
      } 
     }; 
     q.add(CommonParams.QT, "/spell"); 
     q.add(params); 

     QueryResponse response = solrServer.query(q); 

     //init page with search result 
     SpellcheckedPage<ExampleSolrBean> page = new SpellcheckedPage<ExampleSolrBean>(solrTemplate.getConverter().read(response.getResults(), ExampleSolrBean.class)); 

     //add spellcheck result 
     SpellCheckResponse scr = response.getSpellCheckResponse(); 
     for (Suggestion suggestion : scr.getSuggestions()) { 
      page.addSuggestions(suggestion.getToken(), suggestion.getAlternatives()); 
     } 

     return page; 
    } 
}); 

class SpellcheckedPage<T> extends SolrResultPage<T> { 

    public SpellcheckedPage(List<T> content) { 
     super(content); 
    } 

    private Map<String, List<String>> suggestions = new LinkedHashMap<String, List<String>>(); 

    public void addSuggestions(String term, List<String> suggestions) { 
     this.suggestions.put(term, suggestions); 
    } 

    public Collection<String> getSuggestions(String term) { 
     return this.suggestions.get(term); 
    } 

    public Collection<String> getSuggestions() { 
     List<String> allSuggestions = new ArrayList<String>(); 
     for (List<String> suggestions : this.suggestions.values()) { 
      allSuggestions.addAll(suggestions); 
     } 
     return allSuggestions; 
    } 
} 
0

我已經應用了下面的邏輯。

ModifiableSolrParams params = new ModifiableSolrParams(); 
      params.set("qt", "/spell"); 
      params.set("q", searchText); 
      params.set("spellcheck", "on"); 

      QueryResponse response = solrServer.query(params); 
      SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse(); 
      if (!spellCheckResponse.isCorrectlySpelled()) { 
       for (Suggestion suggestion : response.getSpellCheckResponse().getSuggestions()) { 
        logger.debug("Alternative = "+suggestion.getAlternatives()); 
        alternatives.addAll(suggestion.getAlternatives()); 
       } 
      } 

這是正確的嗎?