1

私はSpringでSolrの初心者です。Solr 4.6 と Spring 3.x を使用しています

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.springframework.http.converter.json.MappingJacksonHttpMessageConverter@1fb032d]

ログでわかるように、正しい単語が提案されていますが、@Queryまたは別の注釈を使用してこの提案を取得する方法がわかりません。

私はたくさんのグーグルをしましたが、完璧な解決策は見つかりませんでした。

4

2 に答える 2

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;
    }
}
于 2014-01-30T12:11:42.630 に答える
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());
                }
            }

これは正しいです?

于 2014-01-30T12:42:42.810 に答える