Наши настройки:
Код: Выделить всё
curl -XGET 'http://localhost:9200/my_index?pretty=true'
{
"my_index" : {
"aliases" : { },
"mappings" : {
"Memberships" : {
"_all" : {
"analyzer" : "keylower"
},
"properties" : {
"Amount" : {
"type" : "float"
},
"Members" : {
"type" : "nested",
"properties" : {
"Startdate membership" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"Enddate membership" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"Members" : {
"type" : "string",
"analyzer" : "keylower"
}
}
},
"Membership name" : {
"type" : "string",
"analyzer" : "keylower"
},
"Description" : {
"type" : "string",
"analyzer" : "keylower"
},
"elementId" : {
"type" : "integer"
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1441310632366",
"number_of_shards" : "1",
"analysis" : {
"filter" : {
"my_char_filter" : {
"type" : "asciifolding",
"preserve_original" : "true"
}
},
"analyzer" : {
"keylower" : {
"filter" : [ "lowercase", "my_char_filter" ],
"tokenizer" : "keyword"
}
}
},
"number_of_replicas" : "1",
"version" : {
"created" : "1040599"
},
"uuid" : "nn16-9cTQ7Gn9NMBlFxHsw"
}
},
"warmers" : { }
}
}
Поле «Members» может содержать несколько участников, и именно здесь начинаются проблемы. Если поле содержит всего пару элементов (как в примере ниже), проблем не возникает. Однако поле может содержать сотни или тысячи элементов, и именно тогда мы получаем огромную ошибку термина.
Код: Выделить всё
curl 'http://localhost:9200/my_index/_search?pretty=true&q=*:*'
{
"took":1,
"timed_out":false,
"_shards":{
"total":1,
"successful":1,
"failed":0
},
"hits":{
"total":1,
"max_score":1.0,
"hits":[
{
"_index":"my_index",
"_type":"Memberships",
"_id":"15",
"_score":1.0,
"_source":{
"elementId":[
"15"
],
"Membership name":[
"My membership"
],
"Amount":[
"100"
],
"Description":[
"This is the description."
],
"Members":[
{
"Members":"John Johnson",
"Startdate membership":"2015-01-09",
"Enddate membership":"2015-09-03"
},
{
"Members":"Pete Peterson",
"Startdate membership":"2015-09-09"
},
{
"Members":"Santa Claus",
"Startdate membership":"2015-09-16"
}
]
}
}
]
}
}
"error":"IllegalArgumentException[Документ содержит по крайней мере один
огромный термин в поле="_all" (кодировка UTF8 которого превышает
максимальную длину 32766), все из которых были пропущены. Исправьте
анализатор, чтобы он не выдавал такие термины. Префикс первого огромного
терма: '[...]...', исходное сообщение: длина не может превышать 32766 байт; получено 106807]; вложенное: MaxBytesLengthExceededException[длина
не может быть больше 32766; получено 106807]; " "status":500
Мы получаем эту ошибку _all-field, а не исходное поле Members. При использовании ignore_above поиск в поле _all по полному имени больше невозможен. С помощью стандартного анализатора я бы нашел этот документ, если бы выполнял поиск по запросу «Санта Джонсон», поскольку в _all-fields есть токены «Санта» и «Джонсон». Вот почему я использую keylower для этих полей.
Мне нужен анализатор, который выполняет токенизацию полей, но не разбивает значения в самих полях. Теперь происходит то, что все поле «Члены» подается как один токен, включая дочерние поля. (итак, токен в приведенном выше примере будет следующим:
- Джон Джонсон 09.01.2015 09.09.2015 Пит Петерсон 09.09.2015 Санта-Клаус 16.09.2015
- Джон Джонсон
- 2015-01-09
- 2015-09-03
- Пит Петерсон
- 2015-09-09
- Санта-Клаус
- 16 сентября 2015 г.
Подробнее здесь: https://stackoverflow.com/questions/323 ... -all-field
Мобильная версия