最初に機能させてから変更されていない次のクエリがあります。
ISearchResponse<Series> response = await IndexManager.GetClient()
.SearchAsync<Series>(r => r
.Filter(f => f.Term<Role>(t => t.ReleasableTo.First(), Role.Visitor))
.SortDescending(ser => ser.EndDate)
.Size(1));
私IndexManager.GetClient()
は、ElasticSearch への接続を設定し、インデックスが適切に構築されていることを確認するだけです。コードの残りの部分は、一般公開可能な最新の記事シリーズを取得します。
内部では、IndexManager
明示的なインデックス マッピングを設定しました。これを行うと、毎回クエリから結果が得られました。コードは次のようになります。
client.Map<Series>(m => m.Dynamic(DynamicMappingOption.Allow)
.DynamicTemplates(t => t
.Add(a => a.Name("releasableTo").Match("*releasableTo").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("id").Match("*id").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("services").Match("*amPm").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed)))
.Match("*dayOfWeek").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("urls").Match("*Url").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
));
これは良いことですが、格納したすべての型に対してこれを行うと、実際にはうまくスケーリングできません。そこで、属性を使用してそのようにマッピングすることを意識的に決定しました。
// In IndexManager
client.Map<T>(m => m.MapFromAttributes());
// In the type definition
class Series
{
// ....
[DataMember]
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true)]
public HashSet<Role> ReleasableTo { get; set; }
// ....
}
これをやるとすぐに結果が得られなくなります。Kibana でインデックスを確認すると、'releaseableTo' フィールドが分析されておらず、インデックスが作成されていることがわかります。しかし、私が書いたクエリは機能しなくなりました。フィルター句を削除すると結果が得られますが、実際に機能させる必要があります。
私は何が欠けていますか?クエリを再び機能させるにはどうすればよいですか?