2013-07-31 29 views
6

cập nhật để hiển thị một mẫu làm việcXác định và sử dụng một NGramTokenizer với C# NEST khách hàng cho đàn hồi Tìm kiếm

Tôi cố gắng để thực hiện tìm kiếm một phần trên một tập hợp các tên người dùng trong ElasticSearch.

Tìm kiếm xung quanh đã chỉ cho tôi theo hướng nGram Tokenizer nhưng tôi bị bối rối khi triển khai đúng và không nhận được bất kỳ kết quả nào.

Đây là mã có liên quan bị tước khỏi dự án tôi đang làm việc.

Tôi đã thử các kết hợp và loại tìm kiếm khác nhau không có kết quả.

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

Bất cứ lời khuyên sẽ được nhiều đánh giá cao.

Trả lời

3

Hãy nhìn vào điều này từ 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" ] 
       } 
      } 
     } 
    } 

Một số điều cần lưu ý

  1. Bạn cần phải thêm mynGram để phân tích của bạn hoặc nó sẽ không được sử dụng. Họ làm việc như thế này. Mỗi trường được lập chỉ mục có một trình phân tích được áp dụng cho nó, một bộ phân tích là một mã thông báo tiếp theo không hoặc nhiều hơn bộ lọc mã thông báo. Bạn đã xác định một bộ mã thông báo nGram đẹp (mynGram) để sử dụng, nhưng bạn không sử dụng nó trong customAnalyzer, nó đang sử dụng mã thông báo standard. (Về cơ bản bạn chỉ định nhưng không bao giờ sử dụng mynGram.)

  2. Bạn cần phải cho elasticsearch sử dụng của bạn customAnalyzer trong bản đồ của bạn: "properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}

  3. Bạn nên thay đổi các maxGram cho một số lớn hơn (có lẽ 10) , nếu không, tìm kiếm 4 chữ cái sẽ không hoạt động chính xác như tự động hoàn thành (hoặc có thể trả về không có gì, phụ thuộc vào trình phân tích thời gian tìm kiếm).

  4. Sử dụng điểm cuối api _analyze api để kiểm tra trình phân tích của bạn. Một cái gì đó dòng này nên làm việc.

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

Chúc may mắn!

+0

Và như thể ma thuật hoạt động. Tôi sẽ cập nhật mẫu để hiển thị phiên bản cố định để tham khảo trong tương lai. Cảm ơn bạn đã hướng dẫn. – RLewis

+0

Liên kết không hoạt động. –

Các vấn đề liên quan