0

我有以下地图/变换

public class PositionSearch : AbstractIndexCreationTask<Employer>
{
    public PositionSearch()
    {
        Map = employers => 
            from employer in employers
            from position in employer.Positions
            select new
            {
               EmployerName = employer.Name,
               SearchSkills = position.RequiredSkills
                                      .Select(x => x.Skill)
            };

        TransformResults = (database, results) => 
            from result in results
            from position in result.Positions
            select new
            {
                EmployerId = result.Id,
                EmployerName = result.Name,
                PositionId = position.Id,
                PositionTitle = position.Title,
                RequiredSkills = position.RequiredSkills
                                    .Select(x => new { x.Skill, x.Proficiency })
            };

        // Any field you are going to use .Search() on should be analyzed.
        Index("SearchSkills", FieldIndexing.Analyzed);
    }
}

我有一个雇主对象,有两个职位,每个职位都有一个技能,“NH”和“MVC”

当我执行以下查询时,我得到了两个位置结果,而我期望的是一个。谁能告诉我为什么会这样?我有一种感觉,这与我正在表演的加入有关,但我不确定。

using (var session = DocumentStore.OpenSession())
{
     var results = session.Query<PositionSearchResultModel, PositionSearch>()
                    .Customize(x => x.WaitForNonStaleResults())
                        .Search(x => x.SearchSkills, "NH")
                    .OfType<PositionSearchResultModel>().ToList();

      Assert.AreEqual(1, results.Count());
}

我想使用转换,以便我可以访问 Temp-Index-Score 元数据进行排序,到目前为止,我无法在没有转换的情况下访问元数据。

4

1 回答 1

2

您正在为Employer文档编制索引。搜索找到了包含相关技能的文档,然后您要求转换文档

之前拥有它的方式是从索引中投影,这是您将找到的特定位置作为结果的一部分的唯一方法。

我真的认为你会更高兴,Position因为它是自己的文件......

public class Employer
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Position
{
    public string Id { get; set; }
    public string EmployerId { get; set; }
    public string Title { get; set; }
    public string Location { get; set; }
    public ICollection<SkillProficiency> RequiredSkills { get; set; }
}

这在思考上可能看起来更具关联性,但它在 RavenDB 中工作得很好,而且查询起来比你现在做的要容易得多。

于 2013-02-13T20:55:35.003 回答