Indexes: Converting to JSON and Accessing Metadata

Entities passed to an index can be converted to JSON using AsJson method. There is also a possibility to access metadata for a specified object using MetadataFor method.

AsJson - Converting to JSON

public class Products_AllProperties : AbstractIndexCreationTask<Product, Products_AllProperties.Result>
{
    public class Result
    {
        public string Query { get; set; }
    }

    public Products_AllProperties()
    {
        Map = products => from product in products
            select new
            {
                // convert product to JSON and select all properties from it
                Query = AsJson(product).Select(x => x.Value)
            };

        // mark 'Query' field as analyzed which enables full text search operations
        Index(x => x.Query, FieldIndexing.Search);
    }
}

IList<Product> results = session
	.Query<Products_AllProperties.Result, Products_AllProperties>()
	.Where(x => x.Query == "Chocolade")
	.OfType<Product>()
	.ToList();

MetadataFor - Accessing Metadata

public class Products_WithMetadata : AbstractIndexCreationTask<Product>
{
	public class Result
	{
		public DateTime LastModified { get; set; }
	}

	public Products_WithMetadata()
	{
		Map = products => from product in products
					let metadata = MetadataFor(product)
					select new
					{
						LastModified = metadata.Value<DateTime>("@last-modified")
					};
	}
}

IList<Product> results = session
	.Query<Products_WithMetadata.Result, Products_WithMetadata>()
	.OrderByDescending(x => x.LastModified)
	.OfType<Product>()
	.ToList();