2016-10-01 4 views
1

Ich bin ein Neuling für elasticsearch und wir bewerten elasticsearch für unseren Webshop. Ein wichtiges Merkmal ist die Verwendung von Synonymen. Leider kann ich keinen Index mit Synonymen erstellen. Bitte kann mir jemand helfen, wie ich das Synonym-Feature nutzen kann. Ich habe für diese Funktion und elasticsearch 2.xx keine Probe gefunden. Das Ziel sollte sein, wenn ich nach Hills suche, wird der Eintrag von Royal gefunden.ElasticSearch Nest Synonyme 2.XX

Ich verwende den folgenden Code ein:

private ElasticClient GetClient() 
     { 
      var node = new Uri(ES_URI); 

      var uri = new Uri("http://localhost:9200"); 
      var settings = new ConnectionSettings(uri).DefaultIndex("product"); 
      var client = new ElasticClient(settings); 

      return client; 

     } 


public void CreateSynonymIndex() 
     { 
      Product product = new Product() 
      { 
       Id = "2", 
       ProductName = "Royal", 
       Description = "Katzenfutter für Nierkranke" 


      }; 


      var client = GetClient(); 
      client.DeleteIndex("product"); 
      var syn = new[] { "royal, hills => royal" }; 

      ICreateIndexResponse respose = client.CreateIndex("product", c => c 

      .Mappings(mp => mp.Map<Product>(d => d. 
       Properties(p => p.String(n => n.Name(name => name.ProductName).Index(FieldIndexOption.Analyzed))))) 

       .Settings(s => s 
       .Analysis(an => an 
       .Tokenizers(at=>at.Pattern("synonymTokenizer",pa=>pa.Pattern("Test"))) 
       .Analyzers(a=>a.Custom("synonymAnalyser",ca =>ca 
       .Tokenizer("synonymTokenizer") 
       .Filters(new List<string> { "synonym" }))) 
       .TokenFilters(tf => tf 
       .Synonym("synonym", sy => sy.Synonyms(syn) 
       .Tokenizer("whitespace") 
       .IgnoreCase(true))))) 
       ); 

      client.Index(product); 


     } 

public void ES_Search() 
     { 
      var client = GetClient(); 
      var response = client.Search<Product>(search => search 
    .Query(q => q.Bool(b => b 
     .Should(
      // s => s.Match(m => m.Query("sometest").Field(f => f.ProductName).Boost(1.1)), 
      s => s.Match(m => m.Query("hills").Field(f => f.ProductName).Fuzziness(Fuzziness.EditDistance(1))) 
     )))); 

      var response1 = client.Search<Product>(s => s.Query(q => q.Term(p => p.ProductName, "hills"))); 

}

Grüße,

Dominik

+0

Verwenden Sie NEST 2.x? – Rob

+0

Hallo, ich benutze NEST V 2.4.6. Ich brauche ein funktionierendes Beispiel für die Suche mit Synonymen. – ROEMING

Antwort

1

Sie haben mit Synonymen erstellt Analysator, aber Sie werden es nicht verwenden. Sie müssen elasticsearch mitteilen, dass das ProductName Feld synonymAnalyser Analysator verwenden soll.

.Mappings(mp => mp.Map<Product>(d => d. 
    Properties(p => p.String(n => n 
     .Name(name => name.ProductName) 
     .Analyzer("synonymAnalyser") 
     .Index(FieldIndexOption.Analyzed))))) 

Ich bemerkte paar Dinge aber:

  • remeber, daß das Dokument in Elasticsearch nach dem Aufruf client.Index(..) Methode nicht sofort verfügbar ist. Es wird einige Millisekunden dauern. Wenn Sie direkt nach der Indizierung des Dokuments suchen, können Sie es möglicherweise nicht finden. Sie können mehr darüber lesen here

  • Ich weiß nicht, ob Sie ElasticClient mit Standardindex erstellen, weil Sie es nicht geteilt haben. Wenn nicht, müssen Sie es in Ihren Suchanrufen angeben, z. client.Search<Product>(s => s.Index("product")).

Hoffnung, die Ihnen hilft.

Verwandte Themen