こんにちわ
NGramであれば、というよりは検索クエリに依ると考えています。
どのような検索クエリを実行されてますでしょうか?
たとえば、以下のようなクエリを想定しました。
POST forum0131/_search
{
"query": {
"simple_query_string": {
"query": "test",
"fields": ["descriptiondata"],
"default_operator": "and"
}
}
}
POST forum0131/_search
{
"query": {
"match": {
"descriptiondata": {
"query": "test",
"operator": "and"
}
}
}
}
こうした指定ですと、"t”, "e", "s", "t", "te", "es", "st" が順不同で、トークンとして存在すれば、検索にヒットとなります。
esstem を考えたとき、 "e", "s", "t" というトークンが出来るわけで、順不同であれば testから生成されるトークンと合致しますよね。
順不同ではなく、順序も条件に含めたいときは、simple_query_stringであれば 検索キーワードを""で囲む、あるいはmatch_phraseを使うと良いのではと思います。
POST forum0131/_search
{
"query": {
"simple_query_string": {
"query": "\"test\"",
"fields": ["descriptiondata"],
"default_operator": "and"
}
}
}
POST forum0131/_search
{
"query": {
"match_phrase": {
"descriptiondata": "test"
}
}
}
念のためですが、simple_query_stringやmatchは、デフォルトでOR検索になっているので
test という条件を入れたときは、 t OR e OR s OR t OR te OR es OR st というような検索になるので、
検索対象のフィールドに "t" しかない状態でも、testという検索キーワードでヒットする、ということになります。
そのため、最初の方に示した例では、operatorにand指定を追加するようにしております。
ご参考になれば幸いです。
以下、こちらが確認した際に使った設定を転記しておきます。
インデックス設定
PUT forum0131
{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer",
"filter": [
]
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "2",
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
}
}
}
},
"mappings": {
"properties": {
"descriptiondata": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
}
}
テストデータ
POST forum0131/_doc/1
{
"descriptiondata": "esstem"
}