我使用的是apache-solr-3.5.0,我希望制作类似:http://www.kaufda.de/Berlin
的内容(短语建议)
我使用了建议器 - (Solr的灵活“自动完成”组件)
如本文所述:http://css.dzone.com/news/solr-and-autocomplete-part-2
这是我的solrconfig:
<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
<fieldType class="solr.TextField" name="text_auto">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="name" type="text" indexed="true" stored="true" multiValued="false" />
<field name="name_autocomplete" type="text_auto" indexed="true" stored="true" multiValued="false" />
<field name="description" type="text" indexed="true" stored="true" multiValued="false" />
<copyField source="name" dest="name_autocomplete" />
在我的PHP代码上:
$solr = $this->getSolr();
$response = NULL;
if (!$solr) {
return;
}
$params = array();
$params['spellcheck.build'] = 'true';
$params['spellcheck'] = 'true';
$params['qt'] = '';
$result = $solr->search( 'har', 0, 10, $params );
结果是没有建议的数组。
如何在PHP中使用Suggester?
提前感谢您的帮助
干杯
答案 0 :(得分:1)
您可以使用建议器组件本身,而不是使用拼写检查组件。
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mySuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str> <!-- org.apache.solr.spelling.suggest.fst -->
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str> <!-- org.apache.solr.spelling.suggest.HighFrequencyDictionaryFactory -->
<str name="field">name</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">text_general</str>
<int name="maxEdits">2</int>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="df">text</str>
<str name="suggest">true</str>
<str name="suggest.count">10</str>
<str name="suggest.dictionary">mySuggester</str>
</lst>
<arr name="last-components">
<str>suggest</str>
</arr>
</requestHandler>
注意: AnalyzingInfixLookupFactory 也允许您搜索中缀。假设您的搜索项目是 Squash ,并且用户输入 uash ,则会提供Squash作为建议。
即使用户拼写错误,FuzzyLookupFactory 也可以提供建议。
这些是在solrconfig.xml文件中进行的更改,从php创建实例也在本页的其他答案中得到了很好的解释。所以我跳过那一部分。希望这会有所帮助。
编辑:您还必须在 Service.php 中编写建议服务,如果您要将实例创建为{{{},则该服务与搜索服务非常相似1}}而不是$result = $solr->**suggest**( 'har', 0, 10, $params );
答案 1 :(得分:0)
您是否尝试直接在solr上进行测试?那最好是看看值是否正确生成然后你可以调试PHP代码。
您可以通过访问以下内容来查看值:
http://localhost:8983/solr/suggest?q=har&spellcheck=true&spellcheck.collate=true&spellcheck.build=true
如果您没有使用默认配置,则可能需要更改端口。
答案 2 :(得分:0)
查看http://www.cominvent.com/2012/01/25/super-flexible-autocomplete-with-solr/以获得更灵活的建议。
建议不要在每次提出建议时建立字典(spellcheck.build = true)。
答案 3 :(得分:0)
在搜索完所有帮助后,我找到了解决方案。
参数是正确的。
在我的PHP代码上,我添加了带有'/ suggest'值的qt param
新代码
$solr = $this->getSolr();
$response = NULL;
if (!$solr) {
return;
}
$params = array();
$params['spellcheck.build'] = 'true';
$params['spellcheck'] = 'true';
$params['qt'] = '/suggest';
$result = $solr->search( 'har', 0, 10, $params );
感谢您的帮助,
干杯
答案 4 :(得分:0)
使用搜索组件代替拼写检查
将此代码添加到您的solrconfig.xml
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mainSuggester</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">searchable_field</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">text_general</str>
<str name="queryAnalyzerFieldType">phrase_suggest</str>
<str name="buildOnStartup">false</str>
</lst>
</searchComponent>
在solarconfig.xml中指定建议处理程序
<requestHandler name="/suggest" class="solr.SearchHandler"
startup="lazy" >
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
在PHP的try块中,使用下面的代码
try {
$input = $request->all();
$query_param = $input['search'];
$query = $this->client->createSuggester();
$query->setQuery($query_param); //multiple terms
$query->setDictionary('mainSuggester');
$query->setCount(10);
$query->setBuild(true);
$resultset = $this->client->suggester($query);
$docs = $resultset->getResponse();
$data = json_decode($docs->getBody());$message, $code);
}
其中$ query_param是请求。 mainSuggester是solrconfig.xml文件中指定的字典名称 在这里$ data将返回整个建议的数组对象