转换过滤器

时间:2013-02-13 20:22:34

标签: indexing mapreduce ravendb

我有以下地图/转换

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元数据进行排序,到目前为止,我无法在没有转换的情况下访问元数据。

1 个答案:

答案 0 :(得分:2)

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

你拥有它的方式before是从索引中投射出来的,这是你在结果中找到特定位置的唯一方法。

我真的认为你会对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中运行得很好,并且查询比现在正在做的更容易。