Получение MaxBytesLengthExceededException для TextField - PullRequest
1 голос
/ 24 октября 2019

Я получаю org.apache.lucene.util.BytesRefHash$MaxBytesLengthExceededException, пытаясь вставить в Solr список из 9 элементов, один из которых имеет длину 242905 байт.

ОШИБКА:

"error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","org.apache.lucene.util.BytesRefHash$MaxBytesLengthExceededException",
      "error-class","org.apache.solr.update.processor.DistributedUpdateProcessor$DistributedUpdatesAsyncException",
      "root-error-class","org.apache.solr.update.processor.DistributedUpdateProcessor$DistributedUpdatesAsyncException"],
    "msg":"Async exception during distributed update: Error from server at http://solr-host:8983/solr/search_collection_xx: Bad Request \n\n request: http://solr-host:8983/solr/search_collection_xx \n\n Remote error message: Exception writing document id <document_id> to the index; possible analysis error: Document contains at least one immense term in field=\"text_field_name\" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped.  Please correct the analyzer to not produce such terms.  The prefix of the first immense term is: '[115, 97, 115, 109, 101, 45, 100, 97, 109, 101, 46, 99, 111, 109, 47, 108, 121, 99, 107, 97, 47, 37, 50, 50, 37, 50, 48, 109, 101, 116]...', original message: bytes can be at most 32766 in length; got 242905. Perhaps the document has an indexed string field (solr.StrField) which is too large",
    "code":400}
}

solr_schema:

    <dynamicField name="text_field_*"  indexed="true" stored="true" multiValued="true" type="case_insensitive_text" />

    <fieldType name="case_insensitive_text" class="solr.TextField" multiValued="false">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

В официальной документации указано, что StrField имеет жесткий предел чуть менее 32 Кб, как видно из ошибки. Но здесь мы используем TextField, и в этом ответе очевидно, что 242905 байт не должно быть проблемой (учитывая, что поле не было многозначным).

Так что яхотел бы знать, в чем заключается проблема с вводом этих объемов данных и существует ли способ избежать данного исключения?

1 Ответ

1 голос
/ 25 октября 2019

Вы получаете эту проблему, потому что вы используете KeywordTokenizerFactory, который хранит весь текст как есть (без токенизации), что приводит в вашем случае к созданию одного огромного термина, который невозможно сохранить.

Каждый термин в Solr / Lucene по-прежнему ограничен 32k, поэтому вы получаете это исключение.

Часть кода, связанная с ним:

        if (len2 > BYTE_BLOCK_SIZE) {
          throw new MaxBytesLengthExceededException("bytes can be at most "
              + (BYTE_BLOCK_SIZE - 2) + " in length; got " + bytes.length);
        }

Что выНужно сделать, чтобы избежать ограничения, это выбрать какой-нибудь токенайзер, который разделит ваш текст на несколько терминов. Один из самых полезных: WhitespaceTokenizerFactory, StandardTokenizerFactory и, конечно, у Solr / Lucene есть намного больше

...