Unsere Einstellungen:
Code: Select all
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" : { }
}
}
Das Feld „Mitglieder“ kann mehrere Mitglieder enthalten, und hier beginnen die Probleme. Wenn das Feld nur ein paar Mitglieder enthält (wie im Beispiel unten), gibt es kein Problem. Allerdings kann das Feld Hunderte oder Tausende von Mitgliedern enthalten, was zu einem immensen Termfehler führt.
Code: Select all
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[Das Dokument enthält mindestens einen
immensen Begriff in field="_all" (dessen UTF8-Codierung länger ist als die
maximale Länge 32766), die alle übersprungen wurden. Bitte korrigieren Sie den
Analysator, um solche Begriffe nicht zu erzeugen. Das Präfix des ersten immensen
Begriffs lautet: '[...]...', Originalmeldung: Bytes können höchstens 32766 lang sein; got 106807]; " "status":500
auf dem ursprünglichen Mitgliederfeld. Mit „ignore_above“ ist es nicht mehr möglich, im Feld „_all“ nach „fullname“ zu suchen. Mit dem Standardanalysator würde ich dieses Dokument finden, wenn ich nach „Santa Johnson“ suchen würde, da die _all-Felder ein Token „Santa“ und „Johnson“ haben. Deshalb verwende ich keylower für diese Felder.
Was ich möchte, ist ein Analysator, der ein Feld tokenisiert, aber die Werte in den Feldern selbst nicht auflöst. Was jetzt passiert, ist, dass das gesamte Feld „Mitglieder“ als ein Token gefüttert wird, einschließlich der untergeordneten Felder. (Das Token im obigen Beispiel wäre also:
- John Johnson 2015-01-09 2015-09-03 Pete Peterson 2015-09-09 Santa Claus 2015-09-16
- John Johnson
- 2015-01-09
- 2015-09-03
- Pete Peterson
- 2015-09-09
- Santa Claus
- 2015-09-16
Mobile version