【问题标题】:solrj "org.apache.solr.common.util.SimpleOrderedMap cannot be cast to java.util.Map" exception when using "/suggest" handler使用“/suggest”处理程序时,solrj“org.apache.solr.common.util.SimpleOrderedMap 无法转换为 java.util.Map”异常
【发布时间】:2019-03-12 07:00:11
【问题描述】:

我在尝试使用 /suggest 处理程序运行 solrj 程序时遇到类转换异常。我能够从 Solr Admin UI 获得建议响应,但是当从 solrj 客户端尝试相同时,会出现上述异常。

solr-config.xml 条目如下:

 <searchComponent name="suggest" class="solr.SuggestComponent">
    <lst name="suggester">
            <str name="name">mySuggester</str>
            <str name="lookupImpl">FuzzyLookupFactory</str>
            <str name="dictionaryImpl">DocumentDictionaryFactory</str>
            <str name="field">suggestfield</str>
            <str name="suggestAnalyzerFieldType">text_general</str>

    </lst>
  </searchComponent>

  <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
            <str name="suggest">true</str>
            <str name="suggest.count">10</str>
        <str name="suggest.dictionary">mySuggester</str>
    </lst>
    <arr name="components">
            <str>suggest</str>
    </arr>
  </requestHandler>

schema.xml 包含该字段

<field name="suggestfield" type="text_general" indexed="true" stored="true"/>

这是多个字段的copyField。

java代码如下:

 String url = "http://localhost:8983/solr/testwidget"; 
    HttpSolrClient client = new HttpSolrClient.Builder(url).build();
    client.setParser(new XMLResponseParser());

    SolrQuery query = new SolrQuery();
    query.setRequestHandler("/suggest");
    query.setParam("suggest.build", true);
    query.setParam("suggest", true);
    query.setParam("suggest.dictionary", "mySuggester");
    query.setParam("suggest.q", "acc");

    QueryResponse response = client.query(query);
  System.out.println(response.getSuggesterResponse().getSuggestedTerms());

例外情况如下:

 Exception in thread "main" java.lang.ClassCastException: org.apache.solr.common.util.SimpleOrderedMap cannot be cast to java.util.Map
    at org.apache.solr.client.solrj.response.QueryResponse.setResponse(QueryResponse.java:161)
    at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:194)
    at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:942)
    at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:957)
    at com.intellectdesign.canvas.solr.SolrjTest.main(SolrjTest.java:41)

【问题讨论】:

    标签: java solr solrj


    【解决方案1】:

    我不确定为什么它设置XMLResponseParser 然后请求wt=json。我认为https://github.com/apache/lucene-solr/blob/master/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSuggesterResponse.java 可以作为开始的样本。

    【讨论】:

    • 是的,那是错误的..“request wt=json”被用于其他目的。问题仍然存在。
    【解决方案2】:

    为建议者使用多值字段是否有意义?它建议哪一个? copyField 指令会将多个文本块放在一个字段中。

    你想要什么结果?这种设计对我来说没有意义。

    【讨论】:

    • 之所以将其设为copyField,是为了获得来自多个领域而非单个领域的建议。由于它是一个建议领域,因此需要来自各个领域的建议,而不仅仅是一个领域。正如官方文档lucene.apache.org/solr/guide/7_6/suggester.html 中给出的那样,“要用作建议的基础,必须存储该字段。您可能希望使用 copyField 规则来创建一个特殊的“建议”字段,该字段由文档中其他字段的术语组成。 "建议字段可以是 copyField。
    【解决方案3】:

    “org.apache.solr.common.util.SimpleOrderedMap cannot be cast to java.util.Map”问题的原因在代码的sn-p下方。

    if ( "suggest".equals( n ) )  {
            _suggestInfo = (Map<String,NamedList<Object>>) res.getVal( i );
            extractSuggesterInfo(_suggestInfo);
          }
    

    执行此操作的类是“org.apache.solr.client.solrj.response”包下的“QueryResponse”,它内置在solrj中。

    在我的例子中,我使用 Rest Client 执行了建议操作。

    import org.springframework.web.client.RestTemplate;
    final RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8983/solr/{core}/suggest?q={term}";
    Map<Map<?, ?>, Map<?, ?>> forNow = restTemplate.getForObject(url, HashMap.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多