C# Lucene.NET:如何使用BlockJoinQuery?
我正在尝试使用Lucene.NET4.8进行关系搜索(实际上我是使用编译的),方法如下。我引用了C# Lucene.NET:如何使用BlockJoinQuery?,c#,lucene.net,relational,C#,Lucene.net,Relational,我正在尝试使用Lucene.NET4.8进行关系搜索(实际上我是使用编译的),方法如下。我引用了Lucene.Net,Lucene.Net.Analysis.Common,Lucene.Net.Grouping,Lucene.Net.Join,以及Lucene.Net.QueryParser 问题是:我没有得到任何结果。在下面的例子中,我考虑 Blog < /COD> 父< /代码>,而注释是儿童< /代码>。我想找到一个博客,它包含第一个,并且有一条评论,其中包含类似的(这是一个Id为的博客)
Lucene.Net
,Lucene.Net.Analysis.Common
,Lucene.Net.Grouping
,Lucene.Net.Join
,以及Lucene.Net.QueryParser
问题是:我没有得到任何结果。在下面的例子中,我考虑<代码> Blog < /COD> <代码>父< /代码>,而<代码>注释<代码>是<代码>儿童< /代码>。我想找到一个博客,它包含第一个
,并且有一条评论,其中包含类似的
(这是一个Id为的博客)
如何修复此示例代码
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.");
static void BlockJoinQueryTest(字符串dbFolder)
{
var分析仪=新的标准分析仪(LuceneVersion.LUCENE_48);
var config=newindexwriterconfig(LuceneVersion.LUCENE_48,analyzer);
config.SetOpenMode(IndexWriterConfig.OpenMode\u e.CREATE\u或\u APPEND);
var indexPathBlog=dbFolder+“\\blog\u 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=新的IndexWriter(indexDirectoryBlog,config);
文档注释=新文档();
添加(新的TextField(“BlogId”,“1”,Field.Store.YES));
comment.Add(newtextfield(“CommentContent”,“我喜欢你的第一个博客!”,Field.Store.YES));
添加(新的文本字段(“Type”,“comment”,Field.Store.YES));
添加(新的文本字段(“Note”,“child”,Field.Store.YES));
indexWriterBlog.AddDocument(注释);
注释=新文档();
添加(新的TextField(“BlogId”,“1”,Field.Store.YES));
添加(newtextfield(“CommentContent”,“没那么好”,Field.Store.YES));
添加(新的文本字段(“Type”,“comment”,Field.Store.YES));
添加(新的文本字段(“Note”,“child”,Field.Store.YES));
indexWriterBlog.AddDocument(注释);
Document blog=新文档();
添加(新的文本字段(“Id”,“1”,Field.Store.YES));
添加(newtextfield(“BlogContent”,“第一个博客的内容”,Field.Store.YES));
添加(新的文本字段(“Type”,“blog”,Field.Store.YES));
添加(新的文本字段(“Note”,“parent”,Field.Store.YES));
indexWriterBlog.AddDocument(blog);
blog=新文档();
添加(新的文本字段(“Id”,“2”,Field.Store.YES));
blog.Add(newtextfield(“BlogContent”,“这是第二个blog!”,Field.Store.YES));
添加(新的文本字段(“Type”,“blog”,Field.Store.YES));
添加(新的文本字段(“Note”,“parent”,Field.Store.YES));
indexWriterBlog.AddDocument(blog);
indexWriterBlog.Commit();
var searcher=newindexsearcher(DirectoryReader.Open(indexDirectoryBlog));
WriteLine(“开始内容枚举:”);
for(int i=0;i
您不需要一次将文档添加为IEnumerable
,这样它们就被“阻止”了吗
解释更多
编辑:
我试过用下面的代码来做这件事,但似乎也不起作用,如果有人能解释一下,我会很感激的
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.");
var分析器=新的标准分析器(LuceneVersion.LUCENE_48);
var config=newindexwriterconfig(LuceneVersion.LUCENE_48,analyzer);
config.SetOpenMode(IndexWriterConfig.OpenMode\u e.CREATE\u或\u APPEND);
var indexPathBlog=“D:\\Test”;
if(System.IO.Directory.Exists(indexPathBlog))
var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
config.SetOpenMode(OpenMode.CREATE_OR_APPEND);
var indexPathBlog = Path.Combine(Environment.CurrentDirectory, "index");
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>();
Document commentOne = new Document();
commentOne.Add(new TextField("BlogId", "1", Field.Store.YES));
commentOne.Add(new TextField("CommentContent", "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);
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.NO));
blogOne.Add(new TextField("Note", "parent", Field.Store.YES));
one.Add(blogOne);
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);
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.NO));
blogTwo.Add(new TextField("Note", "parent", Field.Store.YES));
two.Add(blogTwo);
indexWriterBlog.AddDocuments(one);
indexWriterBlog.AddDocuments(two);
indexWriterBlog.Commit();
var searcher = new IndexSearcher(DirectoryReader.Open(indexDirectoryBlog));
Filter parentQuery =
new FixedBitSetCachingWrapperFilter(
new QueryWrapperFilter(
new TermQuery(
new Term("Type", "blog"))));
BooleanQuery childQuery = new BooleanQuery();
childQuery.Add(new TermQuery(new Term("CommentContent", "blog")), 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, 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.");
Console.ReadKey();
<PackageReference Include="Lucene.Net" Version="4.8.0-beta00005" />
<PackageReference Include="Lucene.Net.Analysis.Common" Version="4.8.0-beta00005" />
<PackageReference Include="Lucene.Net.Join" Version="4.8.0-beta00005" />