gpt4 book ai didi

c# - Lucene.NET:如何使用 BlockJoinQuery?

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:39 25 4
gpt4 key购买 nike

我正在尝试使用 Lucene.NET 4.8 进行关系搜索(实际上我是使用 latest sources 编译的),方法是遵循 this post .我引用了 Lucene.NetLucene.Net.Analysis.CommonLucene.Net.GroupingLucene.Net.JoinLucene.Net.QueryParser

问题是:我没有得到任何结果。在我下面的示例中,我认为 blogparentcommentschildren。我想找到一个包含 first 且评论包含 like 的博客(即带有 Id 1 的评论)。

如何修复此示例代码?

    static void BlockJoinQueryTest(string dbFolder)
{
var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
config.SetOpenMode(IndexWriterConfig.OpenMode_e.CREATE_OR_APPEND);

var indexPathBlog = dbFolder + "\\blog_db";
if (System.IO.Directory.Exists(indexPathBlog))
{
System.IO.Directory.Delete(indexPathBlog, true);
}
System.IO.Directory.CreateDirectory(indexPathBlog);
var indexDirectoryBlog = FSDirectory.Open(new System.IO.DirectoryInfo(indexPathBlog));
var indexWriterBlog = new IndexWriter(indexDirectoryBlog, config);

Document comment = new Document();
comment.Add(new TextField("BlogId", "1", Field.Store.YES));
comment.Add(new TextField("CommentContent", "I like your first blog!", Field.Store.YES));
comment.Add(new TextField("Type", "comment", Field.Store.YES));
comment.Add(new TextField("Note", "child", Field.Store.YES));
indexWriterBlog.AddDocument(comment);

comment = new Document();
comment.Add(new TextField("BlogId", "1", Field.Store.YES));
comment.Add(new TextField("CommentContent", "Not that great.", Field.Store.YES));
comment.Add(new TextField("Type", "comment", Field.Store.YES));
comment.Add(new TextField("Note", "child", Field.Store.YES));
indexWriterBlog.AddDocument(comment);

Document blog = new Document();
blog.Add(new TextField("Id", "1", Field.Store.YES));
blog.Add(new TextField("BlogContent", "Content of first blog", Field.Store.YES));
blog.Add(new TextField("Type", "blog", Field.Store.YES));
blog.Add(new TextField("Note", "parent", Field.Store.YES));
indexWriterBlog.AddDocument(blog);

blog = new Document();
blog.Add(new TextField("Id", "2", Field.Store.YES));
blog.Add(new TextField("BlogContent", "This is the second blog!", Field.Store.YES));
blog.Add(new TextField("Type", "blog", Field.Store.YES));
blog.Add(new TextField("Note", "parent", Field.Store.YES));
indexWriterBlog.AddDocument(blog);

indexWriterBlog.Commit();

var searcher = new IndexSearcher(DirectoryReader.Open(indexDirectoryBlog));

Console.WriteLine("Begin content enumeration:");
for (int i = 0; i < searcher.IndexReader.MaxDoc; i++)
{
var doc = searcher.IndexReader.Document(i);
Console.WriteLine("Document " + i + ": " + doc.ToString());
}
Console.WriteLine("End content enumeration.");

Filter blogs = new CachingWrapperFilter(
new QueryWrapperFilter(
new TermQuery(
new Term("Type", "blog"))));
BooleanQuery commentQuery = new BooleanQuery();
commentQuery.Add(new TermQuery(new Term("CommentContent", "like")), BooleanClause.Occur.MUST);
//commentQuery.Add(new TermQuery(new Term("BlogId", "1")), BooleanClause.Occur.MUST);

var commentJoinQuery = new ToParentBlockJoinQuery(
commentQuery,
blogs,
ScoreMode.None);

BooleanQuery query = new BooleanQuery();
query.Add(new TermQuery(new Term("BlogContent", "first")), BooleanClause.Occur.MUST);
query.Add(commentQuery, BooleanClause.Occur.MUST);
var c = new ToParentBlockJoinCollector(
Sort.RELEVANCE, // sort
10, // numHits
true, // trackScores
false // trackMaxScore
);
searcher.Search(query, c);
int maxDocsPerGroup = 10;
var hits = c.GetTopGroups(
commentJoinQuery,
Sort.INDEXORDER,
0, // offset
maxDocsPerGroup, // maxDocsPerGroup
0, // withinGroupOffset
true // fillSortFields
);
if (hits != null)
{
Console.WriteLine("Found " + hits.TotalGroupCount + " groups:");
for (int i = 0; i < hits.TotalGroupCount; i++)
{
var group = hits.Groups[i];
Console.WriteLine("Group " + i + ": " + group.ToString());

for (int j = 0; j < group.TotalHits && j < maxDocsPerGroup; j++)
{
Document doc = searcher.Doc(group.ScoreDocs[j].Doc);
Console.WriteLine("Hit " + i + ": " + doc.ToString());
}
}
}
else
{
Console.WriteLine("No hits.");
}

Console.WriteLine("Done.");

最佳答案

难道您不必一次性添加 Documents 作为 IEnumerable 以便它们被“阻止”吗?

http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html解释更多

编辑:

我试着用下面的代码来做这件事,但似乎也不起作用,如果有人能解释一下,我将不胜感激?

        var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
config.SetOpenMode(IndexWriterConfig.OpenMode_e.CREATE_OR_APPEND);

var indexPathBlog = "D:\\Test";
if (System.IO.Directory.Exists(indexPathBlog))
{
System.IO.Directory.Delete(indexPathBlog, true);
}

System.IO.Directory.CreateDirectory(indexPathBlog);
var indexDirectoryBlog = FSDirectory.Open(new System.IO.DirectoryInfo(indexPathBlog));
var indexWriterBlog = new IndexWriter(indexDirectoryBlog, config);

var one = new List<Document>();
var two = new List<Document>();

var blogOne = new Document();
blogOne.Add(new TextField("Id", "1", Field.Store.YES));
blogOne.Add(new TextField("BlogContent", "Content of first blog", Field.Store.YES));
blogOne.Add(new TextField("Type", "blog", Field.Store.YES));
blogOne.Add(new TextField("Note", "parent", Field.Store.YES));
one.Add(blogOne);

Document commentOne = new Document();
commentOne.Add(new TextField("BlogId", "1", Field.Store.YES));
commentOne.Add(new TextField("CommentContent", "I like your first blog!", Field.Store.YES));
commentOne.Add(new TextField("Type", "comment", Field.Store.YES));
commentOne.Add(new TextField("Note", "child", Field.Store.YES));
one.Add(commentOne);

Document blogTwo = new Document();
blogTwo.Add(new TextField("Id", "2", Field.Store.YES));
blogTwo.Add(new TextField("BlogContent", "This is the second blog!", Field.Store.YES));
blogTwo.Add(new TextField("Type", "blog", Field.Store.YES));
blogTwo.Add(new TextField("Note", "parent", Field.Store.YES));
two.Add(blogTwo);

var commentTwo = new Document();
commentTwo.Add(new TextField("BlogId", "2", Field.Store.YES));
commentTwo.Add(new TextField("CommentContent", "Not that great.", Field.Store.YES));
commentTwo.Add(new TextField("Type", "comment", Field.Store.YES));
commentTwo.Add(new TextField("Note", "child", Field.Store.YES));
two.Add(commentTwo);

indexWriterBlog.AddDocuments(one);
indexWriterBlog.AddDocuments(two);

indexWriterBlog.Commit();

var searcher = new IndexSearcher(DirectoryReader.Open(indexDirectoryBlog));

Filter parentQuery =
new QueryWrapperFilter(
new TermQuery(
new Term("type", "blog")));

BooleanQuery childQuery = new BooleanQuery();
childQuery.Add(new TermQuery(new Term("CommentContent", "I like your first blog!")), BooleanClause.Occur.MUST);

var commentJoinQuery = new ToParentBlockJoinQuery(
childQuery,
parentQuery,
ScoreMode.None);

BooleanQuery query = new BooleanQuery();
//query.Add(new TermQuery(new Term("Type", "blog")), BooleanClause.Occur.MUST);
query.Add(commentJoinQuery, BooleanClause.Occur.MUST);

var c = new ToParentBlockJoinCollector(
Sort.RELEVANCE, // sort
10, // numHits
false, // trackScores
false // trackMaxScore
);

searcher.Search(commentJoinQuery, c);

int maxDocsPerGroup = 10;
var hits = c.GetTopGroups(
commentJoinQuery,
Sort.INDEXORDER,
0, // offset
maxDocsPerGroup, // maxDocsPerGroup
0, // withinGroupOffset
true // fillSortFields
);

if (hits != null)
{
Console.WriteLine("Found " + hits.TotalGroupCount + " groups:");
for (int i = 0; i < hits.TotalGroupCount; i++)
{
var group = hits.Groups[i];
Console.WriteLine("Group " + i + ": " + group.ToString());

for (int j = 0; j < group.TotalHits && j < maxDocsPerGroup; j++)
{
Document doc = searcher.Doc(group.ScoreDocs[j].Doc);
Console.WriteLine("Hit " + i + ": " + doc.ToString());
}
}
}
else
{
Console.WriteLine("No hits.");
}

Console.WriteLine("Done.");

关于c# - Lucene.NET:如何使用 BlockJoinQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39986055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com