ElasticSearch - 无法识别的角色转义

时间:2015-11-24 18:22:31

标签: java json parsing elasticsearch escaping

我有以下例外:

[index {[mmm][info][1484211], source[
{"content":"В 1966 г. М. Флинном (Flynn) был предложен следующий подход к классификации архитектур вычислительных систем. В основу было положено понятие потока, под которым понимается последовательность элементов, команд или данных, обрабатываемая процессором. Соответствующая система классификации основана на рассмотрении числа потоков инструкций и потоков данных и описывает четыре базовых класса (табл. 2.8, рис. 2.48). Коротко рассмотрим отличительные особенности каждой из архитектур. Таблица 2.8 Классификация Флинна Поток данных Поток команд одиночный множественный"}]}]
MapperParsingException[failed to parse [content]]; nested: JsonParseException[Unrecognized character escape '(' (code 40)
 at [Source: org.elasticsearch.common.io.stream.InputStreamStreamInput@5958b83d; line: 1, column: 46]];
    at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:339)
    at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:314)
    at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:441)
    at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:267)
    at org.elasticsearch.index.mapper.DocumentParser.innerParseDocument(DocumentParser.java:127)
    at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:79)
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:318)
    at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:551)
    at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:542)
    at org.elasticsearch.action.support.replication.TransportReplicationAction.prepareIndexOperationOnPrimary(TransportReplicationAction.java:1049)
    at org.elasticsearch.action.support.replication.TransportReplicationAction.executeIndexRequestOnPrimary(TransportReplicationAction.java:1060)
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:170)
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.performOnPrimary(TransportReplicationAction.java:579)
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase$1.doRun(TransportReplicationAction.java:452)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape '(' (code 40)
 at [Source: org.elasticsearch.common.io.stream.InputStreamStreamInput@5958b83d; line: 1, column: 46]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1581)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:533)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._handleUnrecognizedCharacterEscape(ParserMinimalBase.java:510)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._decodeEscaped(UTF8StreamJsonParser.java:3171)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2456)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2411)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:285)
    at org.elasticsearch.common.xcontent.json.JsonXContentParser.text(JsonXContentParser.java:88)
    at org.elasticsearch.common.xcontent.support.AbstractXContentParser.textOrNull(AbstractXContentParser.java:194)
    at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateFieldForString(StringFieldMapper.java:354)
    at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateField(StringFieldMapper.java:294)
    at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:331)
    ... 17 more

我们已经有几个我无法找出问题所在。正如我所看到的所有特殊字符都被转义但是我不断得到这个例外。我使用elasticsearch 2.1。我试过用1.4也是一样的结果。如何解决?

1 个答案:

答案 0 :(得分:2)

错误来自JSON解析器而非弹性搜索本身。你的

  

“В1966г.М.Флинном(Flynn)былпредложенследующийподходк   классификацииархитектурвычислительныхсистем。 Восновубылоположено   понятиепотока,подкоторымпонимаетсяпоследовательностьэлементов,   командилиданных,обрабатываемаяпроцессором。 Соответствующаясистема   классификацииосновананарассмотрениичислапотоковинструкцийи   потоковданныхиописываетчетыребазовыхкласса(табл.2.8,рис。   2.48)。这是一个不错的选择。 Таблица2.8КлассификацияФлиннаПотокданныхПотоккоманд   одиночныймножественный“

对JSON字符串无效。当解析器在String中看到一个字符“\”时,它假定这是转义字符,而下一个字符应该是控制字符,在你的情况下它不是。 “(”或“)”都不是JSON语法中的控制字符。

控制 char (字符)定义中JSON syntax的字符:

char
any-Unicode-character-
    except-"-or-\-or-
    control-character
\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits