2013-07-31 7 views
6

Aktualizacja pokazać próbkę pracującychOkreślanie i za pomocą NGramTokenizer z C# dla klienta NEST Elastic Search

Próbuję zrobić częściową wyszukiwanie w kolekcji nazwy użytkowników w ElasticSearch.

Poszukiwania wskazały mi kierunek nGram Tokenizer, ale jestem zaskoczony we właściwej realizacji i nie uzyskać żadnych wyników.

Jest to odpowiedni kod usunięte z projektu nad którym pracuję.

Próbowałem różnych kombinacji i typów wyszukiwania bez skutku.

setup.cs

var client = new ElasticClient(settings.ConnectionSettings); 

// (Try and) Setup the nGram tokenizer. 
var indexSettings = new IndexSettings(); 
var custonAnalyzer = new CustomAnalyzer(); 

customAnalyzer.Tokenizer = "mynGram"; 
customAnalyzer.Filter = new List<string> { "lowercase" }; 

indexSettings.Analysis.Analyzers.Add("mynGram", customAnalyzer); 

indexSettings.Analysis.Tokenizers.Add("mynGram", new NGramTokenizer 
                { 
                 MaxGram = 10, 
                 MinGram = 2 
                }); 

client.CreateIndex(settings.ConnectionSettings.DefaultIndex, indexSettings); 

client.MapFromAttributes<Profile>(); 

// Create and add a new profile object. 
var profile = new Profile 
        { 
         Id = "1", 
         Username = "Russell" 
        }; 


client.IndexAsync(profile); 

// Do search for object 
var s = new SearchDescriptor<Profile>().Query(t => t.Term(c => c.Username, "russ")); 

var results = client.Search<Profile>(s); 

Profile.cs

public class Profile 
{ 
    public string Id { get; set; } 

    [ElasticProperty(IndexAnalyzer = "mynGram")] 
    public string Username { get; set; } 
} 

Wszelkie wskazówki będą mile widziane.

Odpowiedz

3

Spójrz na to z the es docs on nGram token filters:

"settings" : { 
     "analysis" : { 
      "analyzer" : { 
       "my_ngram_analyzer" : { 
        "tokenizer" : "my_ngram_tokenizer" 
       } 
      }, 
      "tokenizer" : { 
       "my_ngram_tokenizer" : { 
        "type" : "nGram", 
        "min_gram" : "2", 
        "max_gram" : "3", 
        "token_chars": [ "letter", "digit" ] 
       } 
      } 
     } 
    } 

Kilka rzeczy do uwaga

  1. Trzeba dodać mynGram do analizatora lub nie zostaną wykorzystane. Tak to działa. Każde pole indeksowane ma analizatora zastosowany do niej, analizator jest jeden tokenizer następnie zero lub więcej filtrów token. Zdefiniowałeś miły tokenizer nGram (mynGram) do użycia, ale nie użyłeś go w customAnalyzer, używa on tokenizera standard. (W zasadzie dopiero definiowania ale nigdy przy użyciu mynGram.)

  2. Trzeba powiedzieć elasticsearch aby używać swojego customAnalyzer w swoim mapowania: "properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}

  3. Należy zmienić maxGram do większej liczby (może 10) , w przeciwnym razie wyszukiwania czteroliterowe nie będą zachowywać się tak, jak autouzupełnianie (lub nie mogą niczego zwrócić, zależy od analizatora czasu wyszukiwania).

  4. Użyj punktu końcowego api _analyze, aby przetestować analizator. Coś w tym musi działać.

    curl -XGET 'http://yourserver.com:9200?index_name/_analyze?analyzer=customAnalyzer' -d 'rlewis'

Powodzenia!

+0

I jak za pomocą magii działa. Zaktualizuję próbkę, aby pokazać wersję stałą, by móc ją później wykorzystać. Dzięki za wskazówki. – RLewis

+0

Łącze nie działa. –

Powiązane problemy