I have the following Map / Transform
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);
}
}
I have an employer object with two positions, each with a single skill, “NH” and “MVC”
When I execute the following query I’m getting two position results returned, when I expected one.
Can anyone tell me why this is behaving this way? I’ve got a feeling it’s something to do with a join i’m performing, but I’m not sure.
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());
}
I’m wanting to use transform so that I can access the Temp-Index-Score meta data for ordering, I’ve been unable to access the meta data without a transform so far.
You are indexing the
Employerdocument. The search found a document that contained the skill in question, and then you asked to transform the document.The way you had it before is projecting from the index, which is the only way you are going to get the specific position found as part of your results.
I really think you would be happier with
Positionas it’s own document…This may seem more relational in thinking, but it works just fine in RavenDB, and it will be much easier to query than what you are doing now.