2016-10-01 7 views
1

나는 elasticsearch에 대한 초보자이며 우리는 우리 webstore에 대한 elasticsearch을 평가합니다. 한 가지 중요한 기능은 동의어를 사용하는 것입니다. 불행히도 동의어가있는 색인을 만들 수는 없습니다. 아무도 내가 동의어 기능을 어떻게 사용할 수 있는지 알려주세요. 이 기능과 elasticsearch 2.xx에 대한 샘플을 찾지 못했습니다. 목표는 내가 힐스를 검색하면 로얄의 항목을 찾을 수 있어야합니다.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"))); 

}

감사합니다,

도미니크

+0

NEST 2.x를 사용하고 있습니까? – Rob

+0

안녕하세요, NEST V 2.4.6을 사용하고 있습니다. 동의어로 검색하기위한 작업 예제가 필요합니다. – ROEMING

답변

1

당신이 만든 분석기,하지만 당신은 그것을 사용하고 있지 않습니다. ProductName 필드가 synonymAnalyser 분석기를 사용해야한다고 탄성 검색에 알릴 필요가 있습니다.

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

는 비록 몇 가지를 발견 : 해당 문서가 client.Index(..) 방법을 호출 한 후 elasticsearch에서 즉시 사용할 수 없습니다

  • remeber. 몇 밀리 초가 걸립니다. 문서를 색인 생성 한 직후 검색하면 찾을 수 없습니다. 그것에 대해 자세히 알 수 있습니다 here

  • ElasticClient을 기본 색인으로 생성했는지 모르겠다. 공유하지 않았기 때문에 잘 모르겠다. 그렇지 않은 경우 검색 호출에 지정해야합니다. client.Search<Product>(s => s.Index("product")).

희망이 도움이됩니다.