یافتن «مطالب مرتبط» توسط لوسین
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۴/۳۱ ۱۷:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
static readonly Lucene.Net.Util.Version _version = Lucene.Net.Util.Version.LUCENE_29;
static readonly IndexSearcher _searcher = new IndexSearcher(@"c:\path\idx", readOnly: true);
private static int GetLuceneDocumentNumber(int postId)
{
var analyzer = new StandardAnalyzer(_version);
var parser = new QueryParser(_version, "Id", analyzer);
var query = parser.Parse(postId.ToString());
var doc = _searcher.Search(query, 1);
if (doc.totalHits == 0)
{
return 0;
}
return doc.scoreDocs[0].doc;
}
private static Query CreateMoreLikeThisQuery(int postId)
{
var docNum = GetLuceneDocumentNumber(postId);
if (docNum == 0)
return null;
var analyzer = new StandardAnalyzer(_version);
var reader = _searcher.GetIndexReader();
var moreLikeThis = new MoreLikeThis(reader);
moreLikeThis.SetAnalyzer(analyzer);
moreLikeThis.SetFieldNames(new[] { "Title", "Body"});
moreLikeThis.SetMinDocFreq(1);
moreLikeThis.SetMinTermFreq(1);
moreLikeThis.SetBoost(true);
return moreLikeThis.Like(docNum);
}
private static void ShowMoreLikeThisPostItems(int postId)
{
var query = CreateMoreLikeThisQuery(postId);
if (query == null)
return;
var hits = _searcher.Search(query, n: 10);
foreach (var item in hits.scoreDocs)
{
var doc = _searcher.Doc(item.doc);
var id = doc.Get("Id");
var title = doc.Get("Title");
Console.WriteLine(title);
}
}
سلام؛ میشه در Lucene جستجویی شبیه sql انجام داد؟ منظور اینکه همزمان item1 رو داخل field1 و item2 رو در field2 و.... جستجو کرد؟
var scoreNorm = 100.0f / hits.MaxScore;
foreach (var doc in docs.OrderByDescending(x => x.Score))
{
// Score = doc.Score * scoreNorm // درصد نزدیکی به جستجوی انجام شده
} private static Query CreateMoreLikeThisQuery(int postId)
{
var docNum = GetLuceneDocumentNumber(postId);
if (docNum == 0)
return null; private static Query CreateMoreLikeThisQuery(int postId)
{
//...
moreLikeThis.SetFieldNames(new[] { "Title", "Body"});