1

私はしばらくこれに苦労してきました。

clients/513次のようなクライアント オブジェクト ( ) があります。

{  
  "Risks": [
    {
      "Id": "421eacf0-14e9-4004-ab0b-95d20e976aac",
      "RiskFactor": "ElectricalEquipment",
      "Description": "Should be allowed to play with electronics."
    },
    {
      "Id": "4bbecbe2-acfc-45c3-b87a-3321e1eca95a",
      "RiskFactor": "ViolenceToStaffVerbal",
      "Description": "Tourettes"
    }
}

次のコードを持つインデックスを作成しました。

地図

from c in docs.Clients
from r in c.Risks
select new { ClientId = c.Id, RiskId = r.Id }

変身

from c in results
from r in c.Risks
select new { ClientId = c.Id, RiskId = r.Id }

MAPは、検索できるようにするプロパティを定義するだけであることを理解していると思います。TRANSFORM は、実際のデータを特定の形で返します。

ClientId、RiskId、およびおそらくリスクに関連するその他のプロパティを返して実行できる.As<ViewModel>()ようにしたいのですが、クエリを実行すると一貫性のない結果が得られるようです。(クエリを実行する回数に応じて、返される結果の数を変更するのが好きです。場合によっては 4 回、場合によっては 5 回です)。

また、RiskId によるフィルタリングは、指定された ID 以外の ID を持つ 1 つ、場合によっては複数のリスクを返すようです。

どんな助けでも大歓迎です。

4

1 に答える 1

6

変換は必要ありません。これは、あなたがやろうとしていることにより役立つインデックスです:

public class ClientRiskIndex : AbstractIndexCreationTask<Client, ClientRiskResult>
{
    public ClientRiskIndex()
    {
        Map = clients => from c in clients
                         from r in c.Risks
                         select new {
                                        ClientId = c.Id,
                                        RiskId = r.Id,
                                        r.RiskFactor,
                                        r.Description
                                    };

        StoreAllFields(FieldStorage.Yes);
    }
}

これは、次のようなクラス構造を想定しています。

public class Client
{
    public string Id { get; set; }
    public IList<Risk> Risks { get; set; }
}

public class Risk
{
    public Guid Id { get; set; }
    public string RiskFactor { get; set; }
    public string Description { get; set; }
}

public class ClientRiskResult
{
    public string ClientId { get; set; }
    public Guid RiskId { get; set; }
    public string RiskFactor { get; set; }
    public string Description { get; set; }
}

クエリを実行すると、次のようなことができます。

session.Query<ClientRiskResult, ClientRiskIndex>()
       .Where(x => x.RiskFactor == "ElectricalEquipment")
       .AsProjection<ClientRiskResult>();

また、リスクの説明に対して全文検索が必要な場合は、次の行をインデックス定義に追加するだけです。

Index(x => x.Description, FieldIndexing.Analyzed);

次に、次のように検索できます。

session.Query<ClientRiskResult, ClientRiskIndex>()
       .Search(x => x.Description, "electronics")
       .AsProjection<ClientRiskResult>();

インデックスにデータを保存し、そこから投影することで、「結果的に一貫した」結果が得られることに注意してください。それがおそらくあなたが説明した結果のソースです。インデックスが古くなくなるまでの時間を考慮するか、待機するようにクエリを具体的にカスタマイズする必要があります。

現実の世界では、インデックス作成が追いつくのに十分な時間があります。テストでは、クエリで待機してこれをシミュレートし.Customize(x=> x.WaitForNonStaleResults())ます。

于 2013-01-04T21:25:41.913 に答える