2

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"))
4

1 に答える 1

0

最初はインデックスで大文字と小文字が区別されていたため、この問題が発生していました。私のテストデータはすべて大文字で始まりました。

大文字と小文字を区別しないように変更しましたが、すぐには更新されませんでした。アナライザーは大文字と小文字を区別しないように構成されているように見えますが、インデックスは更新されませんでした。

インデックスを消去して最初から再作成すると、問題が修正されました。

于 2015-03-11T19:16:01.940 に答える