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
(数値)でソートするとエラーは発生しません。しかし、これは非常に有用ではない検索です。
これを解決する簡単な方法はありますか?
マッピングはどのように見えますか?マッピングは、オーバーライドされたプロパティの属性を期待どおりに取得していますか? –
@RussCam - そうです。記述子は、EmailプロパティにFieldDataをtrueに設定していることを示します。 –