2016-10-01 3 views
1

Я новичок в поиске elastics и мы оцениваем elasticsearch для нашего интернет-магазина. Одной из важных особенностей является использование синонимов. К сожалению, я не могу создать индекс с синонимами. Пожалуйста, помогите мне, как я могу использовать функцию синонимов. Я не нашел никакого образца для этой функции и elasticsearch 2.xx. Цель должна состоять в том, что если я найду Хилс, вы сможете найти вход в Royal.Elasticssearch Nest Синонимы 2.XX

Я использую следующий код:

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"))); 

}

С уважением,

Dominik

+0

Вы используете NEST 2.x? – Rob

+0

Привет, я использую NEST V 2.4.6. Мне нужен рабочий образец для поиска с синонимами. – ROEMING

ответ

1

Вы создали анализатор с синонимами, но не используется. Вы должны сообщить elasticsearch, что поле ProductName должно использовать анализатор synonymAnalyser.

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

Я заметил несколько вещей, хотя:

  • Remeber, что документ не сразу доступен в elasticsearch после вызова метода client.Index(..). Это займет несколько миллисекунд. Поиск сразу после индексации документа, вы можете не найти его. Вы можете подробнее узнать об этом here

  • Я не знаю, был ли ваш создатель ElasticClient с индексом по умолчанию, потому что вы его не делили. Если нет, вы должны указать его в своих поисковых вызовах, например. client.Search<Product>(s => s.Index("product")).

Надеюсь, что вам поможет.

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