2011-08-18 116 views
2

我试图配置一个拼写检查器,以便从我的查询中自动填充完整的句子。SolR:全句拼写检查

我已经能够得到这样的结果:

"american israel" :
-> "american something"
-> "israel something"

但我想:

"american israel" :
-> "american israel something"

这是我的solrconfig.xml中:

<searchComponent name="suggest_full" class="solr.SpellCheckComponent"> 
<str name="queryAnalyzerFieldType">suggestTextFull</str> 
<lst name="spellchecker"> 
    <str name="name">suggest_full</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">text_suggest_full</str> 
    <str name="fieldType">suggestTextFull</str> 
</lst> 
</searchComponent> 

<requestHandler name="/suggest_full" class="org.apache.solr.handler.component.SearchHandler"> 
<lst name="defaults"> 
<str name="echoParams">explicit</str> 
<str name="spellcheck">true</str> 
<str name="spellcheck.dictionary">suggest_full</str> 
<str name="spellcheck.count">10</str> 
<str name="spellcheck.onlyMorePopular">true</str> 
</lst> 
<arr name="last-components"> 
<str>suggest_full</str> 
</arr> 
</requestHandler> 

这是我的schema.xml:

<fieldType name="suggestTextFull" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

... 

<field name="text_suggest_full" type="suggestTextFull" indexed="true" stored="false" multiValued="true"/> 

我读的地方,我必须使用spellcheck.q因为●使用WhitespaceAnalyzer,但是当我使用spellcheck.q我得到一个显示java.lang.NullPointerException

任何想法?

回答

1

如果您拼写检查域(text_suggest_full)包含american somethingisrael something所以一定要确保,这也存在一个文件/项,用价值american israel something

Solr不会将american somethingisrael something合并为一个字词,并且不会将结果应用于您的拼写检查american israel

+0

当然,我在我的一份文件中有“美国以色列的东西”。这不是问题。 – Valentin

0

有没有一种自动完成的方法更适合?参见this文章,例如

+0

我已经完成了一个像这样的自动完成功能(实际上,我用这篇文章来做),但我现在真正想要的是将完整的句子与完整的查询进行匹配。 – Valentin

0

您可以使用建议器/灵活的“自动完成”组件; 您必须Solr的版本3.X

solrconfig.xml中:

<searchComponent name="suggest" class="solr.SpellCheckComponent"> 
    <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">name_autocomplete</str> 
    </lst> 
    </searchComponent> 


    <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler"> 
    <lst name="defaults"> 
    <str name="spellcheck">true</str> 
    <str name="spellcheck.dictionary">suggest</str> 
    <str name="spellcheck.count">10</str> 
    </lst> 
    <arr name="components"> 
    <str>suggest</str> 
    </arr> 
    </requestHandler> 

Shema.xml

<field name="name_autocomplete" type="text" indexed="true" stored="true" multiValued="false" /> 

添加copyField

<copyField source="name" dest="name_autocomplete" /> 

刷新Solr的,重新编制所有和测试: http://localhost:8983/solr/suggest?q=&amerspellcheck=true&spellcheck.collate=true&spellcheck.build=true

得到的东西,如:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="ameri"> 
     <int name="numFound">2</int> 
     <int name="startOffset">0</int> 
     <int name="endOffset">2</int> 
     <arr name="suggestion"> 
      <str>american morocco</str> 
      <str>american morocco something</str> 
     </arr> 
     </lst> 
     <str name="collation">american morocco something</str> 
    </lst> 
    </lst> 
</response> 

希望能够帮助

干杯

0

恕我直言,与拼写检查问题组件是每个单词拼写检查完全索引。 拼写检查单词的“排序规则”不必与索引内的单个文档匹配,但可能来自单独的索引文档。