Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lucene.NET:如何使用BlockJoinQuery?_C#_Lucene.net_Relational - Fatal编程技术网

C# Lucene.NET:如何使用BlockJoinQuery?

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.NET4.8进行关系搜索(实际上我是使用编译的),方法如下。我引用了
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" />