2017-06-16 80 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 
    } 
    ] 
} 
以下令牌分析某一段文字,