1

最初に機能させてから変更されていない次のクエリがあります。

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' フィールドが分​​析されておらず、インデックスが作成されていることがわかります。しかし、私が書いたクエリは機能しなくなりました。フィルター句を削除すると結果が得られますが、実際に機能させる必要があります。

私は何が欠けていますか?クエリを再び機能させるにはどうすればよいですか?

4

1 に答える 1

3

インデックス作成のヒントを提供する ElasticSearch 属性は、s の処理方法を認識していないようですenum

Role問題は、型が列挙型であるという事実であることが判明しました。client.Map<Series>(m => m.MapFromAttributes())呼び出しはそのプロパティをスキップしました。実行時に、プロパティを文字列に動的にマップします。

// In the type definition
class Series
{
    // ....

    [DataMember]
    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true)]
    public HashSet<Role> ReleasableTo { get; set; }

    // ....
}

フィールドに適切にインデックスを付けるには、ElasticProperty属性にタイプを明示的に設定する必要がありました。コードを次のように変更します。

// In the type definition
class Series
{
    // ....

    [DataMember]
    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Type = FieldType.String, Store = true)]
    public HashSet<Role> ReleasableTo { get; set; }

    // ....
}

クエリが再び機能するようにしました。この話の教訓は、それがプリミティブ型でない限り、フィールド型を設定するときに明示することです。

于 2015-03-26T00:31:56.673 に答える