2017-10-27 15 views
0

NESTを使用する検索モジュールを作成しようとしており、検索機能をそれ自身の制限付きコンテキスト内に保持しています。NESTテキストフィールドで並べ替え

これを達成するために、私は次のユーザープロファイルの検索があります。

public class UserProfileSearch : IUserProfileSearch 
{ 
    ... 

    public async Task<PagedItems<UserProfileModel>> FindAsync(string searchTerm, int skip, int take) 
    { 
     var client = _elasticClientProvider.GetClient(); 
     var response = await client.SearchAsync<ElasticUserProfileModel>(s => s 
      .Index(_elasticConfiguration.GetIndex()) 
      .From(skip).Size(take) 
      .Query(q => q.MultiMatch(m => m.Fields(f => f 
       .Field(u => u.Email) 
       .Field(u => u.FirstName) 
       .Field(u => u.LastName)) 
       .Query(searchTerm))) 
      .Sort(q => q.Ascending(u => u.Email))); 
     var count = await client.CountAsync<ElasticUserProfileModel>(s => s.Index(_elasticConfiguration.GetIndex())); 
     return new PagedItems<UserProfileModel> { Items = response.Documents.Cast<UserProfileModel>().ToArray(), Total = count.Count }; 
    } 
} 

応答は、この報告書で一貫して失敗している:

{ "エラー":{ "ROOT_CAUSE":[{ "type": "illegal_argument_exception"、 "reason": "フィールドデータをデフォルトで無効にするフィールドデータは インデックスを反転してメモリにロードするために、[email] にfielddata = trueを設定してください。かなりのメモリを使用する。代わりにキーワードフィールド を使用してください。 "}]、"タイプ ":" search_phase_execution_exception "、" reason ":" シャード シャード "、"フェーズ ":"クエリ "、"グループ化 ":true、" failed_shards " : "{"シャード ":0、"インデックス ":" xxxx "、"ノード ":" xxxx "、"理由 ":{"タイプ ":" illegal_argument_exception "、"理由 ":"フィールドフィールドでフィールドデータ が無効になりますデフォルトでは[電子メール] にfielddata = trueを設定すると、反転された インデックスを反転してメモリにフィールドデータを読み込むことができます。ただし、これは大きなメモリを使用する可能性があることに注意してください。 はまた代わりに、キーワードフィールドを使用する「}}]}、」ステータス」:400}

をしかし、私は報告書で推奨されていたものを行っているが、同じエラーが起こって続けて、私は

を定義しています。報告書が求めているまさに。私は、各エンド・ツー・エンドのテスト中に ElasticUserProfileModelでインデックスを再構築していなければなりません
public class ElasticUserProfileModel : UserProfileModel 
{ 
    [Text(Fielddata = true)] public override string Email { get => base.Email; set => base.Email = value; } 
} 

私もKeyword属性ではなくText属性を使用して試してみましたしかし、tハットはまったく同じエラーを生成しています。

ではなく、Id(数値)でソートするとエラーは発生しません。しかし、これは非常に有用ではない検索です。

これを解決する簡単な方法はありますか?

+0

マッピングはどのように見えますか?マッピングは、オーバーライドされたプロパティの属性を期待どおりに取得していますか? –

+0

@RussCam - そうです。記述子は、EmailプロパティにFieldDataをtrueに設定していることを示します。 –

答えて

0

https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/multi-fields.htmlのドキュメントに基づいて、私はPOCO文字列がキーワードとテキストフィールドの両方に自動的にマッピングされることを発見しました。文字列のソートを有効にするためには、拡張メソッドSuffix()が必要でした。

私はElasticUserProfileModel派生クラスを削除し、FindAsync()方法は、問題を解決し

public async Task<PagedItems<UserProfileModel>> FindAsync(string searchTerm, int skip, int take) 
{ 
    var client = _elasticClientProvider.GetClient(); 
    var response = await client.SearchAsync<UserProfileModel>(s => s 
     .Index(_elasticConfiguration.GetIndex()) 
     .From(skip).Size(take) 
     .Query(q => q.MultiMatch(m => m.Fields(f => f 
      .Field(u => u.Email) 
      .Field(u => u.FirstName) 
      .Field(u => u.LastName)) 
      .Query(searchTerm))) 
     .Sort(q => q.Ascending(u => u.Email.Suffix("keyword")))); 
    var count = await client.CountAsync<UserProfileModel>(s => s.Index(_elasticConfiguration.GetIndex())); 
    return new PagedItems<UserProfileModel> { Items = response.Documents.ToArray(), Total = count.Count }; 
} 

になりました。

関連する問題