Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Lucene.net返回正确的查询命中数,但不返回正确的文档_Lucene_Lucene.net - Fatal编程技术网

Lucene.net返回正确的查询命中数,但不返回正确的文档

Lucene.net返回正确的查询命中数,但不返回正确的文档,lucene,lucene.net,Lucene,Lucene.net,我是Lucene的新手,正在努力解决这个问题。我是这样做的: Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo(dirIndexDir)); //Create the indexWriter IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE

我是Lucene的新手,正在努力解决这个问题。我是这样做的:

        Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo(dirIndexDir));

        //Create the indexWriter
        IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true,
            IndexWriter.MaxFieldLength.UNLIMITED);


            Document doc = new Document();

            doc.Add(new Field("keyform_type", entry.keyForm.type, Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.Add(new Field("keyform_lang", entry.keyForm.lang, Field.Store.YES, Field.Index.NOT_ANALYZED));

                doc.Add(new Field("keyform_dial", entry.keyForm.dial, Field.Store.YES, Field.Index.NOT_ANALYZED));

            doc.Add(new Field("keyform_reg", entry.keyForm.reg, Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.Add(new Field("keyform_term", entry.keyForm.term.Value, Field.Store.YES, Field.Index.ANALYZED));

                if(entry.refForm.type!=null)
                    doc.Add(new Field("refform_type", entry.refForm.type, Field.Store.YES, Field.Index.NOT_ANALYZED));
                if(entry.refForm.lang!=null)
                    doc.Add(new Field("refform_lang", entry.refForm.lang, Field.Store.YES, Field.Index.NOT_ANALYZED));
                if (entry.refForm.dial != null)
                    doc.Add(new Field("refform_dial", entry.refForm.dial, Field.Store.YES, Field.Index.NOT_ANALYZED));

                if(entry.refForm.reg!=null)
                    doc.Add(new Field("refform_reg", entry.refForm.reg, Field.Store.YES, Field.Index.NOT_ANALYZED));
                if(entry.refForm.term.Value!=null)
                    doc.Add(new Field("refform_term", entry.refForm.term.Value, Field.Store.YES, Field.Index.ANALYZED));

                doc.Add(new Field("pos", entry.pos, Field.Store.YES, Field.Index.NOT_ANALYZED));

                for (int s = 0; s < entry.subject.Count; s++)
                {
                    doc.Add(new Field("subject_"+s, entry.subject[s], Field.Store.YES, Field.Index.NOT_ANALYZED));
                }
                for (int g = 0; g < entry.sense.gloss.Count; g++)
                {
                    doc.Add(new Field("gloss_"+g, entry.sense.gloss[g], Field.Store.YES, Field.Index.ANALYZED));

                }
                if (entry.signature.action != null)
                    doc.Add(new Field("action", entry.signature.action, Field.Store.YES, Field.Index.NOT_ANALYZED));
                if (entry.signature.source != null)
                    doc.Add(new Field("source", entry.signature.source, Field.Store.YES, Field.Index.NOT_ANALYZED));
                if(entry.signature.date==0)
                    doc.Add(new Field("date", entry.signature.date.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            //Add the doc
            writer.AddDocument(doc);

        writer.Close();
目录dir=FSDirectory.Open(new System.IO.DirectoryInfo(dirIndexDir)); //创建indexWriter IndexWriter writer=newindexwriter(dir,newstandardAnalyzer(Lucene.Net.Util.Version.Lucene_29)),true, IndexWriter.MaxFieldLength.UNLIMITED); 单据单据=新单据(); 添加单据(新字段(“keyform_type”,entry.keyform.type,Field.Store.YES,Field.Index.NOT_analysis”); 添加文档(新字段(“keyform_lang”,entry.keyform.lang,Field.Store.YES,Field.Index.NOT_analysis”); 添加文档(新字段(“keyform_-dial”,entry.keyform.dial,Field.Store.YES,Field.Index.NOT_-analysis”); 添加文档(新字段(“keyform_reg”,entry.keyform.reg,Field.Store.YES,Field.Index.NOT_analysis”); 添加单据(新字段(“keyform_term”,entry.keyform.term.Value,Field.Store.YES,Field.Index.ANALYZED)); if(entry.refForm.type!=null) 新增单据(新增字段(“refform_type”,entry.refform.type,Field.Store.YES,Field.Index.NOT_analysis”); if(entry.refForm.lang!=null) 添加文档(新字段(“refform_lang”,entry.refform.lang,Field.Store.YES,Field.Index.NOT_analysis”); 如果(entry.refForm.dial!=null) 添加文档(新字段(“refform_dial”,entry.refform.dial,Field.Store.YES,Field.Index.NOT_analysis”); if(entry.refForm.reg!=null) 添加文档(新字段(“refform_reg”,entry.refform.reg,Field.Store.YES,Field.Index.NOT_analysis)); if(entry.refForm.term.Value!=null) 新增单据(新增字段(“refform_term”,entry.refform.term.Value,Field.Store.YES,Field.Index.analysis)); 新增单据(新增字段(“pos”,entry.pos,Field.Store.YES,Field.Index.NOT_analysis)); 对于(int s=0;s 然后,我使用以下代码进行查询:

        //Doesn't matter what term is, same result
        string term="workers";

        Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo(luceneDir));

        IndexSearcher searcher = new IndexSearcher(dir, true);
        List<string> b=new List<string>();
        b.Add("keyform_gloss");
        b.Add("keyform_term");
        b.Add("refform_term");
        b.Add("refform_gloss");
        for (int i = 0; i < nMaxDupes; i++)
            b.Add("gloss_" + i.ToString());
        MultiFieldQueryParser mfqp = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29,
            b.ToArray(), new StandardAnalyzer());
        Query q = mfqp.Parse(term);
        TopDocs td = searcher.Search(q, 300);

        for (int i = 0; i < td.totalHits; i++)
        {
            //Generate a dictionaryEntry for each hit
            Document doc = searcher.Doc(i);

            //Access the document fields, blah
        }
//不管什么术语,结果都一样
字符串term=“workers”;
Directory dir=FSDirectory.Open(new System.IO.DirectoryInfo(luceneDir));
IndexSearcher=newindexSearcher(dir,true);
列表b=新列表();
b、 添加(“keyform_gloss”);
b、 添加(“关键形式”术语);
b、 添加(“参考表格”术语);
b、 添加(“参考表格”);
对于(int i=0;i
不管term的值是什么,Lucene都会返回索引中的前X个文档,其中X=实际匹配term的文档数。当我使用LUKE浏览索引时,一个相同的手写查询(keyform_term:term gloss_0:term等)返回正确数量的结果和与这些结果匹配的正确文档

然而,上面的C#代码总是返回前X个文档,这些文档不一定在任何搜索字段中包含搜索词。他们甚至都不接近

我做错了什么?我知道索引很好,因为我可以在LUKE中搜索它,所以它必须是查询中的某个内容

谢谢

线路:

Document doc = searcher.Doc(i);
应该是

Document doc = searcher.Doc(td.scoreDocs[i].doc);

或者正确的C#语法等价物(对不起,我是Java爱好者)

就是这样,谢谢!如果可以的话,我会投票赞成这个答案。