我有以下地图/转换
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元数据进行排序,到目前为止,我无法在没有转换的情况下访问元数据。
答案 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中运行得很好,并且查询比现在正在做的更容易。