2017-01-09 12 views
1

Ngramトークナイザを使用していて、min_lengthを3、max_lengthを5と指定しました。ただし、5より大きい単語を検索しようとしても、 ESと同じくらい奇妙なことに、長さ6の組み合わせは索引付けされませんが、私はまだレコードを取り出すことができます。ここには何か理論がありますか?そうでない場合、実際にNGramのmax_lengthにはどんな意味がありますか?私は "のためにこれを試してみましたNGram Tokenizerを使用しているときにElasticSearchが最大NGram長を無視します

GET ngramtest/MyEntity/_search 
{ 
"query": { 
    "match": { 
    "testField": "000681" 
    } 
} 
} 

ため

PUT ngramtest/MyEntity/123 
{ 
    "testField":"Z/16/000681" 

} 

AND、このクエリ不気味yeilds結果:私が試したマッピングは...

PUT ngramtest 
{ 
    "mappings": { 
    "MyEntity":{ 
     "properties": { 
     "testField":{ 
      "type": "text", 
      "analyzer": "my_analyzer" 
     } 
     } 

    } 
    }, 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "my_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "my_tokenizer": { 
      "type": "ngram", 
      "min_gram": 3, 
      "max_gram": 5 
     } 
     } 
    } 
    } 
} 

は、テストエンティティをインデックス化され、次の文字列を分析する:

POST ngramtest/_analyze 
{ 
    "analyzer": "my_analyzer", 
    "text": "Z/16/000681." 
} 

私は間違っている場合誰かが私を修正してくださいできますか?

答えて

1

この理由は、分析器my_analyzerが索引付けおよびの検索に使用されているためです。したがって、あなたが6文字の単語abcdefを検索すると、その単語も検索時にngramアナライザによって分析され、abcabcdabcdebcdなどのトークンが生成され、インデックス付きトークンと一致します。

何をする必要があなたのインデックスを拭いて、それを再増殖する前に、あなたのマッピング

"testField":{ 
     "type": "text", 
     "analyzer": "my_analyzer", 
     "search_analyzer": "standard" 
    } 

search_analyzerなどの標準的なアナライザを使用することを指定することで、あなたは、単に検索を指定することで、この理論をテストすることができますあなたの試合で使用するアナライザ

GET ngramtest/MyEntity/_search 
{ 
    "query": { 
    "match": { 
     "testField": { 
     "query": "000681", 
     "analyzer": "standard" 
     } 
    } 
    } 
} 
+0

JSON、BIGで索引付けして検索すると完璧に動作しました:)しかし、私はまだ私のアプリケーションで使用されている.NET(NEST)APIを使用してこれをテストしています。 ;) –

+0

素晴らしい、嬉しい助けて! – Val

関連する問題