2017-06-16 107 views
0

我對Elasticsearch相當陌生。我一直在試圖實現一個可以忽略撇號的基本搜索功能。我發現documentation這一點。對於實現我用巢庫:ElasticSearch(Nest) - 忽略撇號

[ElasticsearchType] 
public class MappingTest 
{ 
    [Text(Analyzer = "english")] 
    public string Title { get; set; } 
} 

索引/搜索:

var indexName = "testindex"; 
var connectionSettings = 
    new ConnectionSettings(
     new Uri("https://url.com")) 
     .DefaultIndex(indexName).EnableDebugMode();var client = new ElasticClient(connectionSettings); 

if (client.IndexExists(Indices.All, descriptor => descriptor.Index(indexName)).Exists) 
    client.DeleteIndex(indexName); 

var response = client.CreateIndex(indexName, i => new CreateIndexDescriptor(indexName) 
    .Mappings(ms => ms 
     .Map<MappingTest>(m => m.AutoMap()) 
    ).Settings(s => s 
     .Analysis(a => a 
      .Analyzers(aa => aa 
       .Custom("english", ca => ca 
        .Tokenizer("standard") 
        .Filters("english_possessive_stemmer", "lowercase") 
       ) 
      ) 
      .TokenFilters(
       t => t.Stemmer("english_possessive_stemmer", d => d.Language("possessive_english"))) 
      .TokenFilters(
       t => t.Stemmer("english_stemmer", d => d.Language("english"))) 
      .TokenFilters(
       t => t.Stop("english_stop", d => d.StopWords("_english_"))) 
     ) 
    )); 


var obj = new MappingTest() { Title = "Example's" }; 


var indexResponse = client.Index(obj); 

var term = "example"; 

QueryContainer commonQuery = 
    Query<MappingTest>.QueryString(qs => qs.Query(term).DefaultField(f => f.Title)); 

var searchResponse = client.Search<MappingTest>(s => s.Query(x => commonQuery)); 
var debug = searchResponse.DebugInformation;  

我嘗試了一些方法,但每一次我沒有得到任何結果。我會提供一些幫助。

回答

0

有幾件事情:

  1. 你並不需要指定自己的自定義"english"分析儀,因爲它的建成Elasticsearch。如果你想implement your own analyzer基於它,那麼你需要指定它,因爲你是。在你的情況下,我不認爲你想指定你自己的,因爲你的自定義分析器只使用english_possessive_stemmerlowercase令牌過濾器。
  2. .TokenFilters()的多次呼叫意味着只有最後一次呼叫獲勝;電話一般在NEST執行任務,所以你會希望

    .TokenFilters(t => t 
        .Stemmer("english_possessive_stemmer", d => d.Language("possessive_english")) 
        .Stemmer("english_stemmer", d => d.Language("english")) 
        .Stop("english_stop", d => d.StopWords("_english_"))) 
    
  3. 在POCO財產TitleText屬性確定用於現場

  4. 的索引文件不會成爲可用的搜索分析,直到刷新後間隔已過(默認值爲1秒),並將新索引的文檔寫入新段。在你的榜樣,我懷疑你的搜索正在運行的文件可用於指數

我建議使用Analyze API與分析儀玩了。你可以創建索引和你的類型的映射,然後用映射爲特定領域

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var defaultIndex = "default-index"; 
    var connectionSettings = new ConnectionSettings(pool) 
     .DefaultIndex(defaultIndex) 
     .PrettyJson() 
     .EnableDebugMode(response => 
      { 
       if (response.RequestBodyInBytes != null) 
       { 
        Console.WriteLine(
         $"{response.HttpMethod} {response.Uri} \n" + 
         $"{Encoding.UTF8.GetString(response.RequestBodyInBytes)}"); 
       } 
       else 
       { 
        Console.WriteLine($"{response.HttpMethod} {response.Uri}"); 
       } 

       Console.WriteLine(); 

       if (response.ResponseBodyInBytes != null) 
       { 
        Console.WriteLine($"Status: {response.HttpStatusCode}\n" + 
          $"{Encoding.UTF8.GetString(response.ResponseBodyInBytes)}\n" + 
          $"{new string('-', 30)}\n"); 
       } 
       else 
       { 
        Console.WriteLine($"Status: {response.HttpStatusCode}\n" + 
          $"{new string('-', 30)}\n"); 
       } 
      }); 

    var client = new ElasticClient(connectionSettings); 

    if (client.IndexExists(defaultIndex).Exists) 
     client.DeleteIndex(defaultIndex); 

    client.CreateIndex(defaultIndex, i => i 
     .Mappings(ms => ms 
      .Map<MappingTest>(m => m 
       .AutoMap() 
      ) 
     ) 
    ); 

    client.Analyze(a => a 
     .Index(defaultIndex) 
     .Field<MappingTest>(f => f.Title) 
     .Text("Example's") 
    ); 
} 

[ElasticsearchType] 
public class MappingTest 
{ 
    [Text(Analyzer = "english")] 
    public string Title { get; set; } 
} 

你可以看到,該分析儀返回Example's

{ 
    "tokens" : [ 
    { 
     "token" : "exampl", 
     "start_offset" : 0, 
     "end_offset" : 9, 
     "type" : "<ALPHANUM>", 
     "position" : 0 
    } 
    ] 
} 
以下令牌分析某一段文字,