2017-06-16 7 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. それはElasticsearchに組み込まれているとして、あなたは、独自のカスタム"english"アナライザを指定する必要はありません。 implement your own analyzerとしたい場合は、そのまま指定する必要があります。あなたのケースでは、カスタムアナライザはトークンフィルタenglish_possessive_stemmerlowercaseを使用しているだけなので、独自のものを指定したいとは思いません。
  2. .TokenFilters()への複数のコールは、最後のコールだけが勝つことを意味します。あなたはPOCOプロパティTitleText属性は、リフレッシュ後までフィールド

  3. インデックス付き文書が検索に使用できるようにはなりませんために使用さアナライザを決定

    .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_"))) 
    
  4. たいと思うので、呼び出しは、一般的にNESTで割り当てを実行します間隔が経過した(デフォルトは1秒)と、新しく索引付けされた文書が新しいセグメントに書き込まれます。あなたの例では、私は、文書がインデックス

私はアナライザーと遊ぶAnalyze APIを使用してお勧めしたいのために利用可能である前に、あなたの検索が実行されている疑いがあります。あなたはアナライザがExample's

{ 
    "tokens" : [ 
    { 
     "token" : "exampl", 
     "start_offset" : 0, 
     "end_offset" : 9, 
     "type" : "<ALPHANUM>", 
     "position" : 0 
    } 
    ] 
} 
ために、次のトークンを返していることがわかります
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; } 
} 

特定のフィールドのマッピングを使用してテキストの一部を分析

そして、あなたのタイプのためのインデックスとのマッピングを作成することができます
関連する問題