solrj «org.apache.solr.common.util.SimpleOrderedMap не может быть преобразован в java.util.Сопоставьте «исключение при использовании обработчика «/ suggest»

#java #solr #solrj

#java #solr #solrj

Вопрос:

Я получаю исключение приведения класса при попытке запустить программу solrj с использованием обработчика /suggest. Я могу получить ответ на предложение от пользовательского интерфейса администратора Solr, но когда то же самое делается с клиента solrj, возникает вышеупомянутое исключение.

The 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>
  

The schema.xml содержит поле

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

который является копиполем из нескольких полей.

Код 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)
  

Ответ №1:

Я не уверен, почему он устанавливает XMLResponseParser , а затем запрашивает wt=json . Я думаю https://github.com/apache/lucene-solr/blob/master/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSuggesterResponse.java может использоваться в качестве примера для начала.

Комментарии:

1. Да, это было по ошибке .. «запрос wt = json» использовался для какой-то другой цели. Проблема по-прежнему сохраняется.

Ответ №2:

Имеет ли смысл использовать многозначное поле для подсказчика? Какой из них он предлагает? Директива copyField поместит несколько фрагментов текста в одно поле.

Какой результат вы хотите? Этот дизайн не имеет смысла для меня.

Комментарии:

1. Причина создания этого copyField заключается в том, чтобы получать предложения не из одного поля, а из многих полей. Поскольку это поле предложения, предложения необходимы из разных полей, а не только из одного. Как указано в официальном документе lucene. apache.org/solr/guide/7_6/suggester.html » Для использования в качестве основы для предложения поле должно быть сохранено. Возможно, вы захотите использовать правила copyField для создания специального поля «предложить», состоящего из терминов из других полей в документах.» предлагаемое поле может быть полем copyField.

Ответ №3:

Причина проблемы «org.apache.solr.common.util.SimpleOrderedMap не может быть преобразован в java.util.Карта» находится ниже фрагмента кода.

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

Класс, который выполняет эту операцию, называется «QueryResponse» из пакета»org.apache.solr.client.solrj.response», который встроен в solrj.

В моем случае я выполнил операцию suggest с использованием Rest-клиента.

 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);