Solr建议用“自动完成”组件与PHP

时间:2012-02-16 10:17:42

标签: php autocomplete solr autosuggest search-suggestion

我使用的是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?

提前感谢您的帮助

干杯

5 个答案:

答案 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)

在搜索完所有帮助后,我找到了解决方案。

参数是正确的。

网址:http://localhost:8983/solr/suggest?q=har&spellcheck=true&spellcheck.collate=true&spellcheck.build=true 给出好结果

在我的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将返回整个建议的数组对象