2015-03-15 2 views
0

Я использую DLL Lucene.Net для полнотекстового поиска. Мое положение (пример): - У меня есть список элементов списка с разными полями для индексации. например Директор {id, type, title, firstname, ...} и Car {id, type, name, color, owner ...}. Все работает нормально, когда я попытался найти Multifield «Rob». Результаты содержат документы директоров и автомобилей.Результаты поиска Lucene.net

Вопрос: Могу ли я узнать, в каком поле результат был найден? название, владелец ..? Мне нравится возвращать проанализированный результат в виде списка MyParsedResult {id, type, content}, где поле содержимого будет содержать соответствующее значение поля doc (например, doc.Get ("firstname"))

Возможно ли это?

спасибо.

ответ

1

Я изменил this answer в соответствии с вашими потребностями

class TVM : Lucene.Net.Index.TermVectorMapper 
{ 
    public HashSet<Lucene.Net.Index.Term> FoundTerms = new HashSet<Lucene.Net.Index.Term>(); 
    HashSet<Lucene.Net.Index.Term> _AllTerms = new HashSet<Lucene.Net.Index.Term>(); 

    public TVM(Lucene.Net.Search.Query q, Lucene.Net.Index.IndexReader r) : base() 
    { 
     q.Rewrite(r).ExtractTerms(_AllTerms); 
    } 

    public override void SetExpectations(string field, int numTerms, bool storeOffsets, bool storePositions) 
    { 
    } 

    public override void SetDocumentNumber(int documentNumber) 
    { 
     FoundTerms.Clear(); 
    } 

    public override void Map(string term, int frequency, Lucene.Net.Index.TermVectorOffsetInfo[] offsets, int[] positions) 
    { 
     var fountTerm = _AllTerms.FirstOrDefault(x => x.Text == term); 
     if (fountTerm != null) FoundTerms.Add(fountTerm); 
    } 

} 

void TermVectorMapperTest() 
{ 
    var dir = new Lucene.Net.Store.RAMDirectory(); 

    //Index 
    using (var writer = new Lucene.Net.Index.IndexWriter(dir, new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED)) 
    { 
     Lucene.Net.Documents.Document d = null; 

     d = new Lucene.Net.Documents.Document(); 
     d.Add(new Lucene.Net.Documents.Field("field1", "microscope aaa", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS)); 
     d.Add(new Lucene.Net.Documents.Field("field2", "microswave bbb", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS)); 
     writer.AddDocument(d); 

     d = new Lucene.Net.Documents.Document(); 
     d.Add(new Lucene.Net.Documents.Field("field2", "microsoft ccc", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS)); 
     writer.AddDocument(d); 

     d = new Lucene.Net.Documents.Document(); 
     d.Add(new Lucene.Net.Documents.Field("field1", "zzz", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS)); 
     writer.AddDocument(d); 
    } 

    //Search 
    using (var indexReader = Lucene.Net.Index.IndexReader.Open(dir, true)) 
    { 
     var indexSearcher = new Lucene.Net.Search.IndexSearcher(indexReader); 

     var queryParser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "field1", new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); 
     queryParser.MultiTermRewriteMethod = Lucene.Net.Search.MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE; 
     var query = queryParser.Parse("field1:micro* field2:micro*"); 

     var results = indexSearcher.Search(query, 5); 

     TVM tvm = new TVM(query, indexReader); 
     foreach(var sd in results.ScoreDocs) 
     { 
      Console.Write("DOCID:" + sd.Doc + " > "); 
      indexReader.GetTermFreqVector(sd.Doc, tvm); 
      Console.WriteLine(String.Join(" ", tvm.FoundTerms.Select(term => "[" + term.Field + ":" + term.Text + "]"))); 
     } 
    } 
} 
+0

Привет, спасибо за ответ и хороший пример. Я попробую ваше решение. Я ожидаю, что в сборнике doc будет содержаться дополнительная информация о позиционировании на местах, а не делать некоторую пост-обработку ... :( – Marian

Смежные вопросы