Immenser Termfehler in Elasticsearch für das Feld „_all“.Php

PHP-Programmierer chatten hier
Anonymous
 Immenser Termfehler in Elasticsearch für das Feld „_all“.

Post by Anonymous »

Ich arbeite an einem Mitgliederverwaltungsprogramm, für das wir Elasticsearch als Suchmaschine verwenden wollen. An diesem Punkt haben wir Probleme mit der Indizierung bestimmter Felder, da diese einen „immensen Begriff“-Fehler im Feld „_all“ generieren.
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" : { }
}
}
Wir verwenden den Keylower-Analyzer, da wir nicht möchten, dass der vollständige Name in Leerzeichen aufgeteilt wird. Dies liegt daran, dass wir sowohl im Feld „_all“ als auch im Feld „Mitglieder“ nach „John Johnson“ suchen möchten.
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"
}
]
}
}
]
}
}
HINWEIS: Das obige Beispiel funktioniert! Nur wenn das Feld „Mitglieder“ (viel) mehr Mitglieder enthält, erhalten wir die Fehlermeldung. Der Fehler, den wir erhalten, lautet:

"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
Ist es möglich, diese Felder so zu tokenisieren, dass jedes Feld an _all as weitergeleitet wird? Separate Token, aber ohne die Werte in den Feldern selbst aufzuteilen? Damit die Token lauten:
  • John Johnson
  • 2015-01-09
  • 2015-09-03
  • Pete Peterson
  • 2015-09-09
  • Santa Claus
  • 2015-09-16
Hinweis: Wir verwenden die Elasticsearch PHP-Bibliothek.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post