Ich benutze ElasticSearch-2.3.5. Ich möchte meinen benutzerdefinierten Analysator zum Mapping hinzufügen, während ich ein Index erstelle.Wie kann man einen benutzerdefinierten Analysator zum Mapping von ElasticSearch-2.3.5 für die Teilsuche hinzufügen?
PUT /library
{
"settings": {
"analysis": {
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "15",
"token_chars": [
"letter",
"digit"
]
}
},
"analyzer": {
"index_ngram_analyzer": {
"type": "custom",
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
}
},
"search_term_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
}
},
"mappings": {
"book": {
"properties": {
"Id": {
"type": "long",
"search_analyzer": "search_term_analyzer",
"index_analyzer": "index_ngram_analyzer",
"term_vector":"with_positions_offsets"
},
"Title": {
"type": "string",
"search_analyzer": "search_term_analyzer",
"index_analyzer": "index_ngram_analyzer",
"term_vector":"with_positions_offsets"
}
}
}
}
}
Ich nehme eine Vorlage Beispiel aus official guide.
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"type1" : {
"properties" : {
"field1" : { "type" : "string", "index" : "not_analyzed" }
}
}
}
}
Aber ich bekomme einen Fehler beim Ausführen des ersten Teils des Codes. Es ist mein Fehler:
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "analyzer [search_term_analyzer] not found for field [Title]"
}
],
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [book]: analyzer [search_term_analyzer] not found for field [Title]",
"caused_by": {
"type": "mapper_parsing_exception",
"reason": "analyzer [search_term_analyzer] not found for field [Title]"
}
},
"status": 400
}
Ich kann es tun, wenn ich meine setzen mappings
innerhalb von settings
, aber ich denke, dass es falsch ist. Also versuche ich, mein Buch zu finden, indem ich einen Teil des Titels verwende. Ich habe zum Beispiel das Buch "King Arthur". Meine Abfrage sieht wie folgt aus:
POST /library/book/_search
{
"query": {
"match": {
"Title": "kin"
}
}
}
Nichts wird gefunden werden. Was ich falsch mache? Kannst du mir helfen? Es scheint, dass mein Analysator und Tokenizer nicht funktionieren. Wie kann ich die Begriffe "k", "i", "ki", "king" usw. bekommen? Weil ich denke, dass ich jetzt nur zwei Begriffe habe. Es gibt 'König' und 'Arthur'.
I‘ Tut mir leid, aber etwas ist schief gelaufen. Vielleicht sollte ich meinen Suchanalysator vor den Analysator stellen? ' "Fehler": { "Wurzel_Ursache": [ { "type": "mapper_parsing_exception", "Grund": "Analysator auf dem Feld [Titel] muss eingestellt werden, wenn search_analyzer gesetzt" }' –
Sie brauchen einfach Ersetzen von "index_analyzer" durch "analyzer", weil ersteres in ES 2.x veraltet war. – Val
Vielleicht API hat eine andere Änderungen, weil ich einen anderen Fehler bekam: '{ " Typ ":" Mapper_parsing_exception ", " Grund ":" Mapping-Definition für [Id] hat nicht unterstützte Parameter: [search_analyzer: search_term_analyzer] [analyzer: index_ngram_analyzer] [term_vector: with_positions_offsets] " }' –