Lucene.net возвращает правильное количество обращений к запросу, но не правильные документы - PullRequest
2 голосов
/ 17 августа 2010

Я новичок в 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();

Затем я делаю запрос с использованием этого кода:

        //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
        }

Независимо от значения терма, Lucene возвращает первые X документов в индексегде X = количество документов, которые на самом деле соответствуют сроку.Когда я просматриваю индекс с помощью LUKE, идентичный ручной запрос (keyform_term: term gloss_0: term и т. Д.) Возвращает как правильное количество результатов, так и правильные документы, соответствующие этим результатам.

Код C # выше, однакоВсегда возвращает первые X документов, которые не обязательно содержат поисковый термин в любом из искомых полей.Они даже не близко.

Что я делаю не так?Я знаю, что индекс хорош, потому что я могу искать его в LUKE, поэтому он должен быть чем-то в запросе ...

Спасибо!

1 Ответ

6 голосов
/ 17 августа 2010

Линия:

Document doc = searcher.Doc(i);

должно быть

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

или правильный синтаксический эквивалент C # (я парень из Java, извините)

...