Ошибка com.google.gson.JsonArray.getAsString для fullTextQuery.getResultList () в поисковом запросе Hibernate - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить данные из идексов с помощью полнотекстового запроса поиска в режиме гибернации. Ниже приведена структура индекса:

 {
    "_index" : "basclt1400",
    "_type" : "com.csc.pt.svc.data.to.Basclt1400TO",
    "_id" : "00,0006682,CPP,05,00",
    "_score" : 1.0,
    "_source" : {
      "id" : "00,0006682,CPP,05,00",
      "location" : "00",
      "master0co" : "05",
      "policy0num" : "0006682",
      "symbol" : "CPP",
      "module" : "00",
      "cltseqnum" : 281,
      "addrseqnum" : "1",
      "policies_location" : [
        "00",
        "00"
      ],
      "policies_master0co" : [
        "05",
        "05"
      ],
      "policies_policy0num" : [
        "0006682",
        "0006682"
      ],
      "policies_trans0stat" : [
        "V",
        "P"
      ],
      "policies_id02" : [
        "02",
        "02"
      ],
      "policies_symbol" : [
        "CPP",
        "CPP"
      ],
      "policies_module" : [
        "00",
        "00"
      ],
      "policies_tot0ag0prm" : [
        "1532.00",
        "1532.00"
      ],
      "policies_issue0code" : [
        "N",
        "N"
      ],
      "policies_id" : [
        "02,00,0006682,CPP,05,00,V",
        "02,00,0006682,CPP,05,00,P"
      ]
    }

Эта структура может изменяться в соответствии с данными в индексе, в некоторых местах данные в поле «icies_policy0num »могут содержать только одну запись, как показано ниже, и она отлично работает с этой структурой:

"_index" : "basclt1400",
    "_type" : "com.csc.pt.svc.data.to.Basclt1400TO",
    "_id" : "00,0012410,CPP,05,00",
    "_score" : 1.0,
    "_source" : {
      "id" : "00,0012410,CPP,05,00",
      "location" : "00",
      "master0co" : "05",
      "policy0num" : "0012410",
      "symbol" : "CPP",
      "module" : "00",
      "cltseqnum" : 281,
      "addrseqnum" : "1",
      "policies_location" : [
        "00"
      ],
      "policies_master0co" : [
        "05"
      ],
      "policies_policy0num" : [
        "0012410"
      ],
      "policies_trans0stat" : [
        "P"
      ],
      "policies_id02" : [
        "02"
      ],
      "policies_symbol" : [
        "CPP"
      ],
      "policies_module" : [
        "00"
      ],
      "policies_tot0ag0prm" : [
        "0.00"
      ],
      "policies_issue0code" : [
        "N"
      ],
      "policies_id" : [
        "02,00,0012410,CPP,05,00,P"
      ]
    }
  }

Я пытаюсь получить это, как показано ниже:

Iterator itr = fullTextQuery.getResultList().iterator();
        List<MasterSearchPmsp0200DataArr> policyArrayFinal = new ArrayList<MasterSearchPmsp0200DataArr>();
        List<MasterSearchPmsp0200DataArr> quoteArrayFinal = new ArrayList<MasterSearchPmsp0200DataArr>();
        while(itr.hasNext()){
           Object[] obj = (Object[]) itr.next();
           char issueCode = (char) obj[5];
           if(issueCode == 'N' || issueCode == 'R') {
               policyArrayFinal.add( new MasterSearchPmsp0200DataArr((String) obj[0], Long.valueOf(to.getCltseqnum()), 
                        (String) obj[1], (String) obj[2], (String) obj[3], (String) obj[4],
                        (char) obj[5], (char) obj[6]));
           }else {
               quoteArrayFinal.add( new MasterSearchPmsp0200DataArr((String) obj[0], Long.valueOf(to.getCltseqnum()), 
                        (String) obj[1], (String) obj[2], (String) obj[3], (String) obj[4],
                        (char) obj[5], (char) obj[6])); 
           }

           }

и выдает ошибку ниже, только для записей, где у нас есть несколько данных в policy_policy0num.

java.lang.IllegalStateException
at com.google.gson.JsonArray.getAsString(JsonArray.java:226)
at org.hibernate.search.elasticsearch.query.impl.PrimitiveProjection.addDocumentField(PrimitiveProjection.java:69)
at org.hibernate.search.elasticsearch.query.impl.PrimitiveProjection.addDocumentField(PrimitiveProjection.java:43)
at org.hibernate.search.elasticsearch.query.impl.TwoWayFieldBridgeProjection.convertFieldValue(TwoWayFieldBridgeProjection.java:60)
at org.hibernate.search.elasticsearch.query.impl.TwoWayFieldBridgeProjection.convertHit(TwoWayFieldBridgeProjection.java:43)
at org.hibernate.search.elasticsearch.query.impl.QueryHitConverter.convert(QueryHitConverter.java:186)
at org.hibernate.search.elasticsearch.query.impl.IndexSearcher.convertQueryHit(IndexSearcher.java:138)
at org.hibernate.search.elasticsearch.query.impl.ElasticsearchHSQueryImpl.queryEntityInfos(ElasticsearchHSQueryImpl.java:233)
at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.doHibernateSearchList(FullTextQueryImpl.java:238)
at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.list(FullTextQueryImpl.java:223)
at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.getResultList(FullTextQueryImpl.java:122)

Прикрепление точки ошибки snaspshot: ошибка снимка Как мне справиться с этим сценарием в спящем поиске Java-кода.

Добавление кода запроса:

Query query = queryBuilder.keyword().onField("cltseqnum").matching(to.getCltseqnum()).createQuery();

        FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, Basclt1400TO.class);
        fullTextQuery.setProjection( "policies_policy0num", "policies_symbol", 
                "policies_module", "policies_master0co","policies_location", "policies_issue0code",
                "policies_trans0stat");

1 Ответ

0 голосов
/ 29 августа 2018

Вы не предоставили код, использованный для построения запроса, но, насколько я вижу, вы используете прогнозы.

Проекции не поддерживают многозначные поля, поэтому вы просто не сможете выполнить эту работу, если не спроецируете весь документ (используя org.hibernate.search.elasticsearch.ElasticsearchProjectionConstants.SOURCE) и проанализируете его самостоятельно, что было бы ужасным взломом.

Я бы рекомендовал использовать «традиционную» загрузку сущностей (без проекций) и получать данные от ваших сущностей. Если у вас нет огромных ограничений производительности, это должно привести к достойной производительности, особенно если вы правильно настроили отображение Hibernate ORM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...