ユーザーは入力を提供してデータベースにクエリを送信できる単純なWebページがあります。現在、mongodbを使用していますが、クエリが高速であるため、elasticsearchに移行したいと考えています。elasticsearch:最初に実行するクエリを指定します。
開始日や終了日などの必須の検索フィールドと、エントリに一致する検索文字列や親エントリに一致するような親検索文字列などのオプションフィールドがあります。親子関係は、各エントリの祖先IDを含むフィールドを介して記述されます。
質問は次のとおりです。検索文字列と親検索文字列の両方が提供されている場合、クエリを実行する前に知っておくべき方法がありますか?
たとえば、特定の親検索では2つのdocs/parentエントリしか得られず、検索文字列に一致するすべての子を取得できます。その場合、最初に親クエリを実行してからエントリクエリを実行する必要があります。
1つのオプションは、両方のクエリのカウントを取得してから、最初に最も小さいものを実行することですが、このソリューションは悪いです。なぜなら、クエリは2回実行されるからです。カウントのために1回、実際のクエリに対して1回。
これを解決する他のオプションはありますか?
PS。私たちは、
例があるユーザーは、次のフィールドに一致するすべてのエントリを検索したいとしましょう
elasticsearch V1.7を使用しています。
するsearchString:type:BLOCK AND name:test
parentSearchString:name:parentTest AND NOT type:BLOCK
これは、私たちのどちらかが
- に
parentSearchString
に一致するすべてのエントリ(親)を取得し、そのIDを格納していることを意味します。次に、searchString
に一致するすべてのエントリを取得し、ancestors
フィールドに親IDのいずれかを含める必要があります。
OR
searchString
に一致するすべてのエントリをフェッチし、すべてancestors
IDを格納します。次に、parentSearchString
に一致するすべてのエントリを取得し、そのIDはancestors
のいずれかです。
親と子の両方のエントリは同じ構造であり、同じインデックスに存在します。親子関係が10回ネストされているため、異なるインデックスを持つことはできません。そのため、エントリは親と子の両方になる可能性があります。エントリは、多かれ少なかれのようになります。すべての
{
id: "e32452365321",
name: "name",
type: "type",
ancestors: "id1 id2 id3" // stored in node as an array of ids
}
私たちは弾力性を更新するのは簡単ではないので、今はそのために作業しなければなりません。私もあなたをよく理解していれば、1つのネストされたクエリで両方のクエリを持つことはできないと思っています。たとえば、親クエリを最初に実行した場合、子クエリは親IDのフィルタを持つ必要があります。そして、私はどこかでこれが現在弾性で利用できないと読んでいます – XeniaSis
私はあなたの検索をかなり理解していないようです。多分あなたのオープニングポストで簡単な例を提供できますか?たぶん、SQLで表現する方が簡単なのであれば。私はそれに応じて私の答えを更新しようとします。あなたの検索があまり複雑ではない(単純なウェブページを持っているので、私はこれを仮定しています)、私はまだそれが1つのクエリ内で実行できると思います。 – Slomo
小さな例を追加しました – XeniaSis