2017-02-09 3 views
1

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'.

Antwort

1

Sie verlegt haben die search_term_analyzer Analysator, sollte es

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",   <---- you probably need to make this a string or remove the analyzers 
      "search_analyzer": "search_term_analyzer", 
      "analyzer": "index_ngram_analyzer", 
      "term_vector":"with_positions_offsets" 
      }, 
      "Title": { 
      "type": "string", 
      "search_analyzer": "search_term_analyzer", 
      "analyzer": "index_ngram_analyzer", 
      "term_vector":"with_positions_offsets" 
      } 
     } 
     } 
    } 
} 

Auch im Inneren des analyzer Abschnitt sein stellen Sie sicher, analyzer zu verwenden, anstatt index_analyzer, letztere wie in ES 2.x

veraltet
+0

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" }' –

+0

Sie brauchen einfach Ersetzen von "index_analyzer" durch "analyzer", weil ersteres in ES 2.x veraltet war. – Val

+0

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] " }' –

Verwandte Themen