2017-04-24 1 views
0

J'utilise Lucene.Net 3.0.3 et j'ai du code de travail mais je n'arrive pas à comprendre comment ajouter un simple formateur.Créer un formateur de surbrillance simple pour Lucene.net 3.0.3

Public Function Lucene_Index_Search_Complete(term As String) As String 
    Dim sb As New StringBuilder() 
    Dim sw As New StringWriter(sb) 
    Dim writer As JsonWriter = New JsonTextWriter(sw) 
    Try 
     Dim d As Lucene.Net.Store.Directory = FSDirectory.Open(New DirectoryInfo(Server.MapPath("~") + "\\IndexedFiles_V33\\")) 
     Dim indexReader As IndexReader = indexReader.Open(d, True) 
     Dim indexSearch As Searcher = New IndexSearcher(indexReader) 
     Dim a As Analyzer = New StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30) 

     'IFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); 


     Dim HighlightFormatter As SimpleHTMLFormatter = New SimpleHTMLFormatter("<span style='background:yellow;'>", "</span>") 

     Dim FieldNames As String() = indexReader.GetFieldNames(indexReader.FieldOption.INDEXED_NO_TERMVECTOR).toArray 
     Dim parser As MultiFieldQueryParser = New MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, FieldNames, a) 

     Dim q As BooleanQuery = New BooleanQuery() 

     term = term.Trim 

     Dim phases As String() = Nothing 
     If term.contains(",") Then 
      phases = Split(term, ",") 
      For Each phase As String In phases 
       q.Add(parser.Parse(phase), Occur.SHOULD) 
      Next 
     Else 
      phases = Split(term, " ") 
      For Each phase As String In phases 
       q.Add(parser.Parse(phase), Occur.MUST) 
      Next 
     End If 



     Dim collector As TopScoreDocCollector = TopScoreDocCollector.create(1000, True) 
     indexSearch.Search(q, collector) 

     Dim hits As ScoreDoc() = collector.topDocs().scoreDocs 


     Dim GrantID As String = "" 
     Dim Title As String = "" 
     Dim Posted_Date As String = "" 
     Dim link As String = "" 
     Dim jsonData As JObject = Nothing 
     Dim purpose As String = "" 
     Dim Short_Description As String = "" 

     ' Loop through the matching hits, retrieving the document 
     writer.WriteStartArray() 
     For i As Integer = 0 To hits.Length - 1 
      Try 
       If i >= 50 Then 
        Exit For 
       End If 

       Dim docId As Integer = hits(i).doc 
       Dim doc As Document = indexSearch.doc(docId) 
       Dim Score As String = hits(i).Score.tostring 
       GrantID = doc.get("GrantID") 
       link = doc.get("link") 
       jsonData = JObject.Parse(doc.get("JSON_Data")) 
       Title = jsonData("Funding Opportunity Title").ToString 
       Posted_Date = jsonData("Posted Date").ToString 
       purpose = jsonData("Funding Opportunity Purpose").ToString 

       writer.WriteStartObject() 
       writer.WritePropertyName("id") 
       writer.WriteValue((1 + i).ToString) 
       writer.WritePropertyName("Grant_ID") 
       writer.WriteValue(GrantID) 
       writer.WritePropertyName("text") 
       writer.WriteValue("<br/>" + Title + "<br/>" + purpose + "<br/><b>Score:</b> " + Score + "<br/>") 
       writer.WritePropertyName("Score") 
       writer.WriteValue(Score) 
       writer.WriteEndObject() 

      Catch ex As Exception 
       WriteErrorLog(ex.Message, link) 

      End Try 
     Next 

     writer.Close() 


     Return sb.ToString 




    Catch ex As Exception 
     Return ex.Message 

    End Try 

End Function 

Tout ce que je veux faire est d'envelopper le terme avec un fond jaune. Toute aide est appréciée parce que j'ai cherché la réponse et je pense qu'il me manque quelque chose. Je dois souligner les termes de recherche qui sont dans les champs JSON de possibilités de financement Objet et les possibilités de financement Titre

+0

On dirait que le titre de votre question devrait être changé. 'Lucene.net 3.0.3' n'est pas utile pour les personnes essayant de trouver des informations sur l'ajout d'un formateur à Lucene. Je ne suis pas sûr si vous pouvez changer le titre/question rétroactivement si – mdiehl13

+0

Je suis d'accord-je l'ai changé- Merci – user1314159

+0

Vous devriez ajouter votre solution comme réponse, ainsi les gens savent que ceci est résolu. – NightOwl888

Répondre

0

avons réussi,

Public Function GeneratePreviewSimpleText(q As Query, text As String, fieldName As String) As String 
    Try 
     Dim scorer As QueryScorer = New QueryScorer(q) 
     Dim formatter As IFormatter = New SimpleHTMLFormatter("<span style='background:yellow;'>", "</span>") 
     Dim fragmenter As SimpleFragmenter = New SimpleFragmenter(50) 
     Dim highlighter As Highlighter = New Highlighter(formatter, scorer) 
     highlighter.TextFragmenter = fragmenter 
     Dim stream As TokenStream = New StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30).TokenStream(fieldName, New StringReader(text)) 


     Return highlighter.GetBestFragments(stream, text, 4, "<br/>") 

    Catch ex As Exception 

    End Try 
End Function