2011-01-06 4 views
4

Ich baue eine Volltextsuche für meine Website in asp.net mvc mit mysql-Datenbank codiert. Diese Website ist für eine nicht-englische Sprache. Ich habe angefangen, daran zu arbeiten, Lucense als Suchmaschine für den Text zu verwenden, aber ich kann keine Informationen darüber finden, ob Unicode unterstützt wird.Unterstützt Lucene Unicode?

Hat jemand Informationen darüber, ob Lucene Unicode unterstützt? Ich möchte keine böse Überraschung ..

Auch Links zu Anfänger Artikel über die Implementierung von Lucene.net wird geschätzt.

+1

Ich http://www.amazon.com/Lucene-Action-Otis-Gospodnetic/dp/1932394281 sehr Lucene in Aktion empfehlen –

Antwort

8

Ja. Es unterstützt vollständig Unicode.
Aber für die Analyse sollten Sie explizit geeignete Stemmer zuweisen und Stoppwörter korrigieren. Wie für Probe. Hier kopieren von unserem letzten Projekt

directory = new RAMDirectory(); 
      analyzer = new StandardAnalyzer(version, new Hashtable()); 
      var indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); 
      using (var session = sessionFactory.OpenStatelessSession()) 
      { 
       organizations = session.CreateCriteria(typeof(Organization)).List<Organization>(); 
       foreach (var organization in organizations) 
       { 
        var document = new Document(); 
        document.Add(new Field("Id", organization.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
        document.Add(new Field("FullName", organization.FullName, Field.Store.NO, Field.Index.ANALYZED_NO_NORMS)); 
        document.Add(new Field("ObjectTypeInvariantName", typeof(Organization).FullName, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
        indexWriter.AddDocument(document); 
       } 

       var persistentType = typeof(Order); 
       var classMetadata = DbContext.SessionFactory.GetClassMetadata(persistentType); 


       var properties = new List<PropertyInfo>(); 
       for (int i = 0; i < classMetadata.PropertyTypes.Length; i++) 
       { 
        var propertyType = classMetadata.PropertyTypes[i]; 
        if (propertyType.IsCollectionType || propertyType.IsEntityType) continue; 
        properties.Add(typeof(Order).GetProperty(classMetadata.PropertyNames[i])); 
       } 

       orders = session.CreateCriteria(typeof(Order)).List<Order>(); 
       var idProperty = typeof(Order).GetProperty(classMetadata.IdentifierPropertyName); 

       foreach (var order in orders) 
       { 
        var document = new Document(); 
        document.Add(new Field("Id", idProperty.GetValue(order, null).ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
        document.Add(new Field("ObjectTypeInvariantName", typeof(Order).FullName, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
        foreach (var property in properties) 
        { 
         var value = property.GetValue(order, null); 
         if (value != null) 
         { 

          document.Add(new Field(property.Name, value.ToString(), Field.Store.NO, Field.Index.ANALYZED_NO_NORMS)); 
         } 
        } 
        indexWriter.AddDocument(document); 
       } 
       indexWriter.Optimize(true); 
       indexWriter.Commit(); 
       return indexWriter.GetReader(); 
      } 

Ich Abfrage Organisation Objekte von NHibernate und steckte sie in Lucene.NET

Hier ist einfache Suche

var searchValue = textEdit1.Text; 

       var parser = new QueryParser(version, "FullName", analyzer); 
       parser.SetLocale(new CultureInfo("ru-RU")); 
       Query query = parser.Parse(searchValue); 
       var indexSearcher = new IndexSearcher(directory, true); 

       var docs = indexSearcher.Search(query, 10); 
       lblSearchTotal.Text = string.Format(totalPattern, docs.totalHits, organizations.Count() + orders.Count); 
       resultPanel.Controls.Clear(); 
       foreach (var found in docs.scoreDocs) 
       { 
        var document = indexSearcher.Doc(found.doc); 
        var objectId = document.Get("Id"); 
        var objectType = document.Get("ObjectTypeInvariantName"); 

        if (resultPanel.Controls.Count > 0) 
        { 
         var labelSeparator = CreateSeparatorLabelControl(); 
         resultPanel.Controls.Add(labelSeparator); 
        } 
        var labelCard = CreateFoundLabelControl(); 
        resultPanel.Controls.Add(labelCard); 

        var organization = organizations.Where(o => o.ID.ToString() == objectId).FirstOrDefault(); 
        if (organization != null) 
        { 
         labelCard.Text = string.Format("<b>{0}</b></br>{1}", organization.AccountNumber, organization.FullName); 
         labelCard.Tag = organization; 
         //labels[count].Text = string.Format("<b>{0}</b></br>{1}", organization.AccountNumber, organization.FullName); 
         //labels[count].Visible = true; 
        } 
        else 
        { 
         labelCard.Text = string.Format("Найден объект типа '{0}' с идентификатором '{1}'", objectType, objectId); 
         labelCard.Tag = mainForm.GetObject(objectType, objectId); 
        } 
        labelCard.Visible = true; 
        //count++; 
       } 
+0

auch können NHibernate suchen verwendet werden. –

2

Lucene tut Unicode-Unterstützung, aber Es gibt Einschränkungen. Zum Beispiel unterstützen einige Dokument Leser nicht Unicode. Auch macht Lucene Dinge wie plurale oder unplurale Wörter. Wenn Sie eine Fremdsprache verwenden, geht das teilweise verloren.

5

Ja, Lucene unterstützt Unicode, weil es Zeichenfolgen im UTF-8-Format speichert.

http://lucene.apache.org/java/3_0_3/fileformats.html

Chars

Lucene schreibt Unicode-Zeichenfolgen als UTF-8-codierten Bytes.

String

Lucene schreibt Strings als UTF-8-codierten Bytes. Zuerst wird die Länge in Bytes als VInt geschrieben, gefolgt von den Bytes.

String -> Vint, Chars