17

C# プロジェクトで、ElasticSearch と NEST を組み合わせて遊んでいます。私のユースケースには、これまで別々にクエリを実行するさまざまなドキュメント タイプの複数のインデックスが含まれています。ここで、既存のすべてのインデックス、ドキュメント タイプに対してクエリを実行し、結果を適切にスコアリングするグローバル検索機能を実装したいと考えています。

だから私の質問: NEST を使用してそれを達成するにはどうすればよいですか?

現在、関数を使用していますSetDefaultIndexが、複数のインデックスを定義するにはどうすればよいですか?

おそらく理解を深めるために、これは私がNESTで実現したいクエリです:

{
  "query": {
    "indices": {
      "indices": [
        "INDEX_A",
        "INDEX_B"
      ],
      "query": {
        "term": {
          "FIELD": "VALUE"
        }
      },
      "no_match_query": {
        "term": {
          "FIELD": "VALUE"
        }
      }
    }
  }
}

ティア

4

1 に答える 1

21

複数のインデックスを使用するように NEST に明示的に指示できます。

client.Search<MyObject>(s=>s
    .Indices(new [] {"Index_A", "Index_B"})
    ...
)

すべてのインデックスを検索したい場合

client.Search<MyObject>(s=>s
    .AllIndices()
    ...
)

または、1 つのインデックス (デフォルトのインデックスではない) を検索する場合

client.Search<MyObject>(s=>s.
    .Index("Index_A")
    ...
)

Elasticsearch 19.8以降、インデックス名にワイルドカードを指定することもできます.

client.Search<MyObject>(s=>s
    .Index("Index_*")
    ...
)

あなたのindexs_queryについては

client.Search<MyObject>(s=>s
    .AllIndices()
    .Query(q=>q
        .Indices(i=>i
            .Indices(new [] { "INDEX_A", "INDEX_B"})
            .Query(iq=>iq.Term("FIELD","VALUE"))
            .NoMatchQuery(iq=>iq.Term("FIELD", "VALUE"))
        )
    )
);

アップデート

これらのテストは、C# の共分散を機能させる方法を示しています。

https://github.com/Mpdreamz/NEST/blob/master/src/Nest.Tests.Integration/Search/SubClassSupport/SubClassSupportTests.cs

あなたの場合、すべてのタイプが共有ベースのサブクラスではない場合でも、「オブジェクト」を使用できます

すなわち:

 .Search<object>(s=>s
      .Types(typeof(Product),typeof(Category),typeof(Manufacturer))
      .Query(...)
 );

これにより、返された各ドキュメントのタイプを理解/yourdefaultindex/products,categories,manufacturers/_searchするデフォルトが検索され、セットアップされます。ConcreteTypeSelector

使用ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type>)すると、json 値 (動的) またはヒット メタデータに基づいて型を手動で返すことができます。

于 2013-04-30T07:23:42.283 に答える