0

私はelasticsearchインデックス「イベント」を持っています - そのインデックス内にタイプ「イベント」があります。

イベントオブジェクトには、「名前」を含むさまざまなプロパティを持つ「会場」があります。したがって、単純化された構造は次のとおりです。

event {
  venue {
    name: "foo"
  }
}

今、私はelasticsearch-railsを使用しています-イベントのリスト、クエリDSLを使用した検索などはすべて正常に機能しますが、特定の名前の会場ですべてのイベントをリストしたい場合はどうすればよいですか?

私は、このようなことが可能であると仮定しています:

Event.search "{ 'query': { 'match': { 'venue.name': '#{params[:v]}' }}}

しかし、私は次のエラーが発生します:

Elasticsearch::Transport::Transport::Errors::BadRequest

この種のものがたくさん含まれている実質的なスタック トレースが続きます。

Was expecting one of:\n    \"]\" ...\n    \"}\" ...\n    ];

不正な形式の json を示唆する ParseExceptions - しかし、その理由はわかりません。

単純な検索

Event.search '{"query" : { "match_all" : {} }}'

正常に動作するので、クエリの構造が間違っているだけだと思います。

一重引用符と二重引用符を切り替えてみましたが、このページの例をより厳密にフォローしてみました:

https://www.elastic.co/guide/en/elasticsearch/guide/current/denormalization.html

他の誰かがこの状況に遭遇したことがあり、ルビーでこれを機能させる方法を提案できるかどうか疑問に思いました。

4

2 に答える 2

0

Elasticsearch の json パーサーは、文字列を区切るために単一引用符を使用しません。最近の一部のパーサーでは可能ですが、これは標準の一部ではありません。

もちろん、それらをエスケープすることもできますが、これにより多少読みにくくなるため、別の形式の引用を使用することをお勧めします。

%< {"query": { "match": { "venue.name": "#{params[:v]}"}}} >

ただし、クエリを ruby​​ ハッシュとして表現し、それを json に変換する方がはるかに優れています (たとえば、上記のスニペットでは、送信された値の特殊文字が正しくエスケープされません)。

于 2015-07-19T13:22:06.340 に答える
0

検索機能に渡そうとしている Json は、有効な Json ではありません。Json の代わりにハッシュを検索関数に渡してみることができます。次のことを試してください。

query_hash = {query: {match: {'venue.name' => params[:v] }}}
Event.search query_hash
于 2015-07-19T13:06:42.297 に答える