Elasticsearch に対して Nest クライアントを使用しています。n-gram インデックス アナライザーを使用しています。奇妙な動作に気付きました。最初から単語を検索すると、結果が得られません。ただし、2文字目以降を検索すると、完全に機能します。これらはごく普通の英字です。
たとえば、「itty」、「itt」、「tty」などを検索すると、「kitty」を含む単語が検索されますが、「ki」、「kit」などは検索されません。ほとんど n-gram のようなものです。最初の文字をスキップするだけです。
これが Nest によって引き起こされているのか、それとも n-gram の通常の動作なのかはわかりません。私のインデックス設定は、次の投稿にあるものと似ています: Elasticsearch using NEST: How to configure Analyzers to find partial words? 私の最大グラムが10しかないことを除いて。
アップデート
コードを少し単純化して、同じ動作を確認しました。
Nest を使用して定義されたマッピング構成は次のとおりです。
const string index = "myApp";
const string type = "account";
const string indexAnalyzer = "custom_ngram_analyser";
const string searchAnalyzer = "standard";
const string tokenizer = "custom_ngram_tokenizer";
const string tokenFilter = "custom_ngram_tokenFilter";
...
client.CreateIndex(index, i => i
.Analysis(ad => ad
.Analyzers(a => a.Add(indexAnalyzer, new CustomAnalyzer() { Tokenizer = tokenizer }))
.Tokenizers(t => t.Add(tokenizer, new NGramTokenizer() { MinGram = 1, MaxGram = 15 }))
.TokenFilters(f => f.Add(tokenFilter, new NgramTokenFilter() { MinGram = 1, MaxGram = 15 })))
.TypeName(account);
.IdField(r => r.SetPath("accountId").SetIndex("not_analyzed").SetStored(true));
.Properties(ps => ps.Number(p => p.Name(r => r.AccountId)
.Index(NonStringIndexOption.not_analyzed)
.Store(true));
.String(p => p.Name(r => r.AccountName)
.Index(FieldIndexOption.analyzed)
.IndexAnalyzer(indexAnalyzer)
.SearchAnalyzer(searchAnalyzer)
.Store(true)
.TermVector(TermVectorOption.no))));
そして、これは最初の文字が欠落している検索です:
SearchCriteria criteria = new SearchCriteria() { AccountName = "kitty" };
client.Search<SearchAccountResult>(s => s
.Index(index)
.Type(type)
.Query(q => q.Bool(b => b.Must(d => d.Match(m => m.OnField(r => r.AccountName).QueryString(criteria.AccountName)))))
.SortDescending("_score"))