2017-11-02 4 views
0

私はすでに動作している弾性検索タイプに同義語アナライザーを使用しようとしました。ここに私のserviceEntityのマッピングがあります:アナライザーでネストされたフィールドを照会するとエラーが発生する

{ 
"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} 
      } 
     } 
    } 
} 

}

とでは何を検索しようとすると、これらは私の

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

を設定している、私はこのエラーを取得:

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

そして私はなぜそれを理解していない。私の設定にアナライザを追加しないと、すべて正常に動作します。

私は、Java APIを使用してelasticsearchインスタンスと通信しています。私はLinkPropsまたはMediaPropsでそれをしようとすると、私は、

{ 
    "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" : { } 
     } 
    } 
    } 
} 

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

のJava APIで作成されたクエリ文字列は次のようになります。そのために私のコードは、マルチ一致のクエリーのために、このようになりますそれぞれのネストされたオブジェクトに対して同じエラーが発生します。

編集:私は、同様のクエリ文字列をチェックするために役立つだろうelasticsearch

答えて

0

私は、これはあなたが見ることができるように

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

、私は「ネストされた」ラッパーを削除しようとしたこれらがする場合は、今、いくつかの結果(わからない、少なくともつながるまだ

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

最終的に正しい結果になる)。私は元のプロジェクトにこれを適用しようとしており、これがうまくいけば投稿しています。

+0

"ネストされた"ラッパーを削除することは、そのトリックでした。 – Syrious

0

のバージョン2.4.6を使用して使用されているESのバージョンを知っています。

私はsynonyms_pathを見ることができませんでした。ネストされた型を使用しているという事実がそのエラーを引き起こす可能性があります。

あなたはおそらくすでにこれを見てきましたが、あなたは

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

+0

ご返信ありがとうございます。私はバージョン2.4.6を使用しています。私はまた、私の質問にJava APIからクエリ文字列を追加しました。同義語のパスについて:私は同義語の外部ファイルを使用することはできません。遅かれ早かれ、すべての同義語はデータベースから来て、私はすべてのインデックスを再作成する必要があります。しかし、それは私が推測するポイントではないはずです。 – Syrious

0

をhaventは場合は私が何をしようとしているの最小限の例を作成しました。

私のマッピングは次のようになります。

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(); 

ElasticSearchヘッドクロームプラグインは、このようなルックスを出してくれるのメタデータ::

Javaコードで同義語・アナライザ用

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

そして、私の設定

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

検索クエリを使用して「テスト」を検索すると、同じエラーが発生する私の最初の記事で述べたように。ここで私は私が

{ 
    "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 
    } 
    ] 
} 

だから、アナライザ正解に取得

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

とアナライザをチェックすると、このエラー

{ 
    "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 
} 

につながるクエリ

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

です正しいことを設定しているようだy。私はマッピングを台無しにしましたか?オブジェクトがネストされているか、それとも問題なのでしょうか?

関連する問題