2017-11-02 1 views
0

Ich habe versucht, einen Synonymanalysator für meinen bereits funktionierenden elastischen Suchtyp zu verwenden. Hier ist die Abbildung meines serviceEntity:Abfrage von verschachtelten Feldern mit Analysator führt zu einem Fehler

{ 
"serviceentity" : { 
    "properties":{   
     "ServiceLangProps" : { 
      "type" : "nested", 
      "properties" : { 
       "NAME"   : {"type" : "string", "search_analyzer": "synonym"}, 
       "LONG_TEXT"  : {"type" : "string", "search_analyzer": "synonym"}, 
       "DESCRIPTION" : {"type" : "string", "search_analyzer": "synonym"}, 
       "MATERIAL"  : {"type" : "string", "search_analyzer": "synonym"}, 
       "LANGUAGE_ID" : {"type" : "string", "include_in_all": false} 
      } 
     }, 
     "LinkProps" : { 
      "type" : "nested", 
      "properties" : { 
       "TITLE" : {"type" : "string", "search_analyzer": "synonym"}, 
       "LINK" : {"type" : "string"}, 
       "LANGUAGE_ID" : {"type" : "string", "include_in_all": false} 
      } 
     }, 
     "MediaProps" : { 
      "type" : "nested", 
      "properties" : { 
       "TITLE"  : {"type" : "string", "search_analyzer": "synonym"}, 
       "FILENAME" : {"type" : "string"}, 
       "LANGUAGE_ID" : {"type" : "string", "include_in_all": false} 
      } 
     } 
    } 
} 

}

Und diese sind meine Einstellung

{ 
    "analysis": { 
    "filter": { 
     "synonym": { 
     "ignore_case": "true", 
     "type": "synonym", 
     "synonyms": [ 
      "lorep, spaceship", 
      "ipsum, planet" 
     ] 
     } 
    }, 
    "analyzer": { 
     "synonym": { 
     "filter": [ 
      "lowercase", 
      "synonym" 
     ], 
     "tokenizer": "whitespace" 
     } 
    } 
    } 
} 

Wenn Im Versuch, um etwas zu suchen, bekomme ich diesen Fehler:

Caused by: org.elasticsearch.index.query.QueryParsingException: [nested] nested object under path [ServiceLangProps] is not of nested type 

Und ich verstehe nicht warum. Wenn ich meiner Einstellung keinen Analysator hinzufüge, funktioniert alles gut.

Ich verwende die Java-API, um mit der elasticsearch-Instanz zu kommunizieren. Deshalb mein Code sieht für die Multi Match Abfrage wie folgt etwas:

MultiMatchQueryBuilder multiMatchBuilder = QueryBuilders.multiMatchQuery(fulltextSearchString, QUERY_FIELDS).analyzer("synonym"); 

Die String-Abfrage durch die Java-API erstellt wie folgt aussieht:

{ 
    "query" : { 
    "bool" : { 
     "must" : { 
     "bool" : { 
      "should" : [ { 
      "nested" : { 
       "query" : { 
       "bool" : { 
        "must" : [ { 
        "match" : { 
         "ServiceLangProps.LANGUAGE_ID" : { 
         "query" : "DE", 
         "type" : "boolean" 
         } 
        } 
        }, { 
        "multi_match" : { 
         "query" : "lorem", 
         "fields" : [ "ServiceLangProps.NAME", "ServiceLangProps.DESCRIPTION", "ServiceLangProps.MATERIALKURZTEXT", "ServiceLangProps.DESCRIPTION_RICHTEXT" ], 
         "analyzer" : "synonym" 
        } 
        } ] 
       } 
       }, 
       "path" : "ServiceLangProps" 
      } 
      }, { 
      "nested" : { 
       "query" : { 
       "bool" : { 
        "must" : [ { 
        "match" : { 
         "LinkProps.LANGUAGE_ID" : { 
         "query" : "DE", 
         "type" : "boolean" 
         } 
        } 
        }, { 
        "match" : { 
         "LinkProps.TITLE" : { 
         "query" : "lorem", 
         "type" : "boolean" 
         } 
        } 
        } ] 
       } 
       }, 
       "path" : "LinkProps" 
      } 
      }, { 
      "nested" : { 
       "query" : { 
       "bool" : { 
        "must" : [ { 
        "match" : { 
         "MediaProps.LANGUAGE_ID" : { 
         "query" : "DE", 
         "type" : "boolean" 
         } 
        } 
        }, { 
        "match" : { 
         "MediaProps.TITLE" : { 
         "query" : "lorem", 
         "type" : "boolean" 
         } 
        } 
        } ] 
       } 
       }, 
       "path" : "MediaProps" 
      } 
      } ] 
     } 
     }, 
     "filter" : { 
     "bool" : { } 
     } 
    } 
    } 
} 

Wenn ich es auf den LinkProps oder MediaProps versuchen, ich Erhalten Sie den gleichen Fehler für das jeweilige verschachtelte Objekt.

Edit: Ich bin mit Version 2.4.6 von Elasticsearch

Antwort

0

ich diese

gerade versucht
{ 
    "query": { 
    "bool": { 
     "must": { 
     "query": { 
      "multi_match": { 
      "query": "foo", 
      "fields": [ 
       "LinkProps.TITLE", 
       "LinkProps.LINK" 
      ], 
      "analyzer": "synonym" 
      } 
     } 
     } 
    } 
    } 
} 

Wie Sie sehen können, habe ich die „verschachtelte“ Wrapper

"nested": { 
      "path": "LinkProps", 
      ... 
} 

die jetzt führt zumindest in einigen Ergebnissen (Noch nicht sicher, ob diese entfernt werden endlich die richtigen Ergebnisse). Ich versuche, dies auf das ursprüngliche Projekt anzuwenden und Sie auf dem Laufenden zu halten, wenn dies auch funktioniert.

+0

Das Entfernen des "verschachtelten" Wrappers hat den Trick gemacht. – Syrious

0

wird verwendet, wäre hilfreich, die Abfragezeichenfolge als auch und zu wissen, welche Version von IHM zu überprüfen.

Ich konnte nicht sehen, dass der synonyms_path sowie die Tatsache, dass Sie verschachtelte Typen verwenden, diesen Fehler verursachen kann.

Sie haben wahrscheinlich schon, aber im Falle gesehen havent Sie

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-synonym-tokenfilter.html

+0

Vielen Dank für Ihre Antwort. Ich benutze Version 2.4.6. Ich habe auch die Abfragezeichenfolge von der Java API zu meiner Frage hinzugefügt. Zum Synonympfad: Ich kann keine externe Datei für Synonyme verwenden. Früher oder später kommen alle Synonyme aus einer Datenbank und ich muss alles neu indizieren. Aber das sollte nicht der Punkt sein, denke ich. – Syrious

0

ich ein minimales Beispiel geschaffen, was ich versuche zu tun.

Meine Abbildung sieht wie folgt aus:

{ 
    "serviceentity" : { 
     "properties":{   
      "LinkProps" : { 
       "type" : "nested", 
       "properties" : { 
        "TITLE" : {"type" : "string", "search_analyzer": "synonym"}, 
        "LINK" : {"type" : "string"}, 
        "LANGUAGE_ID" : {"type" : "string", "include_in_all": false} 
       } 
      } 
     } 
    } 
} 

Und meine Einstellungen für das Synonym Analysator in JAVA-Code:

XContentBuilder builder = jsonBuilder() 
     .startObject() 
      .startObject("analysis") 
       .startObject("filter") 
        .startObject("synonym") // The name of the analyzer 
         .field("type", "synonym") // The type (derivate) 
         .field("ignore_case", "true") 
         .array("synonyms", synonyms) // The synonym list 
        .endObject() 
       .endObject() 
       .startObject("analyzer") 
        .startObject("synonym") 
         .field("tokenizer", "whitespace") 
         .array("filter", "lowercase", "synonym") 
        .endObject() 
       .endObject() 
      .endObject() 
     .endObject(); 

Die Metadaten, die die Elasticsearch Kopf Chrome-Plugin wie folgt aussieht ausspuckt:

{ 
    "analysis": { 
    "filter": { 
     "synonym": { 
     "ignore_case": "true", 
     "type": "synonym", 
     "synonyms": [ 
      "Test, foo", 
      "Title, bar" 
     ] 
     } 
    }, 
    "analyzer": { 
     "synonym": { 
     "filter": [ 
      "lowercase", 
      "synonym" 
     ], 
     "tokenizer": "whitespace" 
     } 
    } 
    } 
} 

Wenn ich jetzt eine Suchanfrage verwende, um nach "Test" zu suchen, bekomme ich die gleiche Fehlermeldung r wie in meinem ersten Post erwähnt.Hier ist die Abfrage

{ 
    "query": { 
    "bool": { 
     "must": { 
     "nested": { 
      "path": "LinkProps", 
      "query": { 
      "multi_match": { 
       "query": "Test", 
       "fields": [ 
       "LinkProps.TITLE", 
       "LinkProps.LINK" 
       ], 
       "analyzer": "synonym" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

, die zu diesem Fehler führt

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "query_parsing_exception", 
     "reason": "[nested] nested object under path [LinkProps] is not of nested type", 
     "index": "minimal", 
     "line": 1, 
     "col": 44 
     } 
    ], 
    "type": "search_phase_execution_exception", 
    "reason": "all shards failed", 
    "phase": "query", 
    "grouped": true, 
    "failed_shards": [ 
     { 
     "shard": 0, 
     "index": "minimal", 
     "node": "6AhE4RCIQwywl49h0Q2-yw", 
     "reason": { 
      "type": "query_parsing_exception", 
      "reason": "[nested] nested object under path [LinkProps] is not of nested type", 
      "index": "minimal", 
      "line": 1, 
      "col": 44 
     } 
     } 
    ] 
    }, 
    "status": 400 
} 

Wenn ich den Analysator überprüfen mit

GET http://localhost:9200/minimal/_analyze?text=foo&analyzer=synonym&pretty=true 

ich die richtige Antwort

{ 
    "tokens": [ 
    { 
     "token": "foo", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "word", 
     "position": 0 
    }, 
    { 
     "token": "test", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "SYNONYM", 
     "position": 0 
    } 
    ] 
} 

So ist der Analysator scheint sich korrekt einzurichten y. Habe ich die Mappings vermasselt? Ich schätze das Problem liegt nicht daran, dass ich Objekte verschachtelt habe oder?

Verwandte Themen