我的网域中有这些文件:
public class Article {
public string Id { get; set; }
// some other properties
public IList<string> KeywordIds { get; set; }
}
public class Keyword {
public string Id { get; set; }
public string UrlName { get; set; }
public string Title { get; set; }
public string Tooltip { get; set; }
public string Description { get; set; }
}
我有这种情况:
A1
具有关键字K1
A2
具有关键字K1
A1
A2
我知道我可以使用
More Like This
bundle 包,并且阅读了文档,但是我不知道该怎么做?你能帮我吗? 最佳答案
看一下这个示例,您可以将“类型”替换为“关键字”:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using Lucene.Net.Analysis;
using Raven.Abstractions.Data;
using Raven.Abstractions.Indexing;
using Raven.Client;
using Raven.Client.Bundles.MoreLikeThis;
using Raven.Client.Indexes;
using Raven.Tests.Helpers;
using Xunit;
namespace RavenDBEval
{
public class MoreLikeThisEvaluation : RavenTestBase
{
private readonly IDocumentStore _store;
public MoreLikeThisEvaluation()
{
_store = (IDocumentStore)NewDocumentStore();
_store.Initialize();
}
[Fact]
public void ShouldMatchTwoMoviesWithSameCast()
{
string id;
using (var session = _store.OpenSession())
{
new MoviesByCastIndex().Execute(_store);
new MoviesByGenreIndex().Execute(_store);
GetGenreList().ForEach(session.Store);
var list = GetMovieList();
list.ForEach(session.Store);
session.SaveChanges();
id = session.Advanced.GetDocumentId(list.First());
WaitForIndexing(_store);
}
using (var session = _store.OpenSession())
{
var moreLikeThisByCast = session
.Advanced
.MoreLikeThis<Movie, MoviesByCastIndex>(new MoreLikeThisQuery
{
DocumentId = id,
Fields = new[] { "Cast" },
MinimumTermFrequency = 1,
MinimumDocumentFrequency = 2
});
var moreLikeThisByGenre = session
.Advanced
.MoreLikeThis<Movie, MoviesByGenreIndex>(new MoreLikeThisQuery
{
DocumentId = id,
Fields = new[] { "Genres" },
MinimumTermFrequency = 1,
MinimumDocumentFrequency = 2
});
foreach (var movie in moreLikeThisByCast)
{
Debug.Print("{0}, Cast={1}", movie.Title, string.Join(",", movie.Cast));
}
Assert.NotEmpty(moreLikeThisByCast);
foreach (var movie in moreLikeThisByGenre)
{
Debug.Print("{0}", movie.Title);
foreach (var genreId in movie.Genres)
{
var genre = session.Load<Genre>(genreId);
Debug.Print("\t\t{0}", genre.Name);
}
}
Assert.NotEmpty(moreLikeThisByGenre);
}
}
private static List<Genre> GetGenreList()
{
return new List<Genre>
{
new Genre {Id = "genres/1", Name = "Comedy"},
new Genre {Id = "genres/2", Name = "Drama"},
new Genre {Id = "genres/3", Name = "Action"},
new Genre {Id = "genres/4", Name = "Sci Fi"},
};
}
private static List<Movie> GetMovieList()
{
return new List<Movie>
{
new Movie
{
Title = "Star Wars Episode IV: A New Hope",
Genres = new[] {"genres/3", "genres/4"},
Cast = new[]
{
"Mark Hamill",
"Harrison Ford",
"Carrie Fisher"
}
},
new Movie
{
Title = "Star Wars Episode V: The Empire Strikes Back",
Genres = new[] {"genres/3", "genres/4"},
Cast = new[]
{
"Mark Hamill",
"Harrison Ford",
"Carrie Fisher"
}
},
new Movie
{
Title = "Some Fake Movie",
Genres = new[] {"genres/2"},
Cast = new[]
{
"James Franco",
"Sting",
"Carrie Fisher"
}
},
new Movie
{
Title = "The Conversation",
Genres = new[] {"genres/2"},
Cast =
new[]
{
"Gene Hackman",
"John Cazale",
"Allen Garfield",
"Harrison Ford"
}
},
new Movie
{
Title = "Animal House",
Genres = new[] {"genres/1"},
Cast = new[]
{
"John Belushi",
"Karen Allen",
"Tom Hulce"
}
},
new Movie
{
Title="Superman",
Genres = new[] {"genres/3", "genres/4"},
Cast= new[]
{
"Christopher Reeve",
"Margot Kidder",
"Gene Hackman",
"Glen Ford"
}
}
};
}
}
public class Movie
{
public string Id { get; set; }
public string Title { get; set; }
public string[] Cast { get; set; }
public string[] Genres { get; set; }
}
public class Genre
{
public string Id { get; set; }
public string Name { get; set; }
}
public class MoviesByGenreIndex : AbstractIndexCreationTask<Movie>
{
public MoviesByGenreIndex()
{
Map = docs => from doc in docs
select new { doc.Genres };
Analyzers = new Dictionary<Expression<Func<Movie, object>>, string>
{
{
x => x.Genres,
typeof (KeywordAnalyzer).FullName
}
};
Stores = new Dictionary<Expression<Func<Movie, object>>, FieldStorage>
{
{
x => x.Genres, FieldStorage.Yes
}
};
}
}
public class MoviesByCastIndex : AbstractIndexCreationTask<Movie>
{
public MoviesByCastIndex()
{
Map = docs => from doc in docs
select new { doc.Cast };
Analyzers = new Dictionary<Expression<Func<Movie, object>>, string>
{
{
x => x.Cast,
typeof (KeywordAnalyzer).FullName
}
};
Stores = new Dictionary<Expression<Func<Movie, object>>, FieldStorage>
{
{
x => x.Cast, FieldStorage.Yes
}
};
}
}
}
输出:
星球大战第五集:帝国反击,演员=马克·哈米尔,哈里森·福特,凯莉·费舍尔
-某些假电影,演员=詹姆斯·佛朗哥,斯廷,凯莉·费雪
-The Conversation,Cast = Gene Hackman,John Cazale,Allen Garfield,Harrison Ford
按类型:
星球大战第5集:帝国反击
行动
科幻
-超人
行动
科幻
注意nuget软件包:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Lucene.Net" version="3.0.3" targetFramework="net40" />
<package id="Lucene.Net.Contrib" version="3.0.3" targetFramework="net40" />
<package id="RavenDB.Client" version="2.0.2261" targetFramework="net40" />
<package id="RavenDB.Database" version="2.0.2261" targetFramework="net40" />
<package id="RavenDB.Embedded" version="2.0.2261" targetFramework="net40" />
<package id="RavenDB.Tests.Helpers" version="2.0.2261" targetFramework="net40" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net40" />
<package id="xunit" version="1.9.1" targetFramework="net40" />
</packages>
关于indexing - 在RavenDB中创建更多这样的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12428215/