【问题标题】:Solr Suggester "autocomplete" component with php带有 php 的 Solr Suggester “自动完成”组件
【发布时间】:2012-03-07 17:50:59
【问题描述】:

我使用 apache-solr-3.5.0,我想做一个类似的东西:http://www.kaufda.de/Berlin

(短语建议)

我使用了 Suggester -(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?

提前感谢您的帮助

干杯

【问题讨论】:

    标签: php autocomplete solr autosuggest search-suggestion


    【解决方案1】:

    使用搜索组件代替拼写检查

    将此代码添加到您的 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>
    

    在你的 try 块内的 php 中使用以下代码

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

    【讨论】:

      【解决方案2】:

      您可以使用建议器组件本身,而不是使用拼写检查组件。

      <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 创建一个实例在此页面上的其他答案中也得到了很好的解释。所以我跳过那部分。希望这会有所帮助。

      EDIT:您还必须在 Service.php 中编写一个建议服务,如果您想将实例创建为@987654322,它与搜索服务非常相似@而不是$result = $solr-&gt;**search**( 'har', 0, 10, $params );

      【讨论】:

        【解决方案3】:

        经过搜索并在您的帮助下,我找到了解决方案。

        参数正确。

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

        在我的 php 代码中,我添加了带有 '/suggest' 值的 qt 参数

        新代码

        $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】:

          查看http://www.cominvent.com/2012/01/25/super-flexible-autocomplete-with-solr/ 以获得更灵活的建议。

          不建议每次请求建议时都构建字典 (spellcheck.build=true)。

          【讨论】:

          • 嗨 Klein,感谢这个非常有趣的链接。我的 solr 没有问题,但 PHP 参数没有问题。
          【解决方案5】:

          您是否尝试直接在 solr 上进行测试?最好查看这些值是否正确生成,然后您可以调试 PHP 代码。

          您可以通过访问查看值:

          http://localhost:8983/solr/suggest?q=har&amp;spellcheck=true&amp;spellcheck.collate=true&amp;spellcheck.build=true

          如果您不使用默认配置,您可能需要更改端口。

          【讨论】:

          • 嗨,感谢您的快速响应,它工作得很好,但是当我在 php 中使用这个参数时,我无法得到这个结果
          • 嗨,我是这个'$result = $solr->search('har', 0, 10, $params );'错误的 ? solrSuggester 还有其他参数吗?
          • 我不知道您使用什么库来与 solr 交互。您需要确保它发送写查询。看看这个php.net/manual/en/solrquery.setquery.php
          • 嗨,我不使用 PHP 的 solr 扩展,但我使用的是 Apache Solr 3.5.0。可以从link下载
          猜你喜欢
          • 1970-01-01
          • 2013-09-14
          • 1970-01-01
          • 2012-12-20
          • 2020-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          相关资源
          最近更新 更多