2013-07-31 99 views
6

更新,以顯示指定並使用NGramTokenizer與C#NEST客戶端彈性搜索

我試圖做的ElasticSearch用戶名的集合部分搜索工作示例。

四處搜索指出我在nGram Tokenizer的方向,但我很難正確實施,並沒有得到任何結果。

這是從我正在處理的項目中剝離的相關代碼。

我試過不同的組合和搜索類型無濟於事。

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; } 
} 

任何提示將不勝感激。

回答

3

看看這個從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" ] 
       } 
      } 
     } 
    } 

有幾件事情需要注意

  1. 您需要添加mynGram到您的分析儀,否則將無法使用。它們的工作方式就是這樣。每個索引字段都應用了一個分析器,一個分析器是一個標記器後跟零個或多個標記過濾器。您已經定義了一個很好的nGram分詞器(mynGram)供您使用,但是您沒有在customAnalyzer中使用它,它使用了standard分詞器。 (基本上你是剛剛確定,但從來沒有使用mynGram

  2. 你需要告訴elasticsearch使用您的customAnalyzer在映射: "properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}

  3. ,則應該更換maxGram到一個更大的數字(也許10)否則4個字母的搜索將不會像自動完成一樣運行(或者不會返回任何內容,這取決於搜索時間分析器)。

  4. 使用_analyze API端點來測試您的分析儀。一些線應該工作。

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

祝你好運!

+0

而且就像它通過魔術它的作品。我會更新示例以顯示固定版本以供將來參考。感謝您的指導。 – RLewis

+0

鏈接不起作用。 –

相關問題