trueanalyze_wildcardに設定すると、動作するはずです。デフォルトでは、クエリ文字列はワイルドカードを含むトークンを分析しません。そのオプションを true に設定すると、elasticsearch が試行されます。ドキュメントが言うように、このオプションは完璧ではありません:
この値を true に設定すると、それらも分析するために最善の努力が払われます。
空の結果の背後にある理由は、デフォルトのアナライザーが を削除して@おり、検索時に*@domain.com*falseanalyze_wildcardであり、@クエリ時に が削除されていないためです。
コードは次のようになります。
.filteredQuery(
queryStringQuery(String.format("*%s*", query)).analyzeWildcard(true)
.field("firstName").field("lastName").field("email").field("phone"),
null
)
編集:空の結果が得られる理由のより良い説明。
まず第一に、アナライザーはインデックス (マッピングでこれを設定) 時とクエリ時に実行できます (すべてのクエリがクエリ時にアナライザーを実行するわけではありません)。
あなたの場合、インデックス時に次のようにstandard analyzerフィールドを分析emailしています:
name@domain.com=> インデックスされてnameおり、domain.com
これは、ドキュメントに と の 2 つのトークンが含まれることを意味しnameますdomain.com。「name@domain.com」という正確な用語を見つけようとしても、ドキュメントに完全な電子メールが含まれていないため、何も見つかりません。
クエリ時に、クエリ文字列を実行しています*@domain.com*。デフォルトでは、クエリ文字列はワイルドカードを含むトークンを分析しないため@domain.com、インデックスの場合ではないものを含むトークンを見つけようとしています。
プロパティanalyze_wildcardを trueに設定すると、Elasticsearch はワイルドカードを使用してこれらのトークンを分析するため、クエリは次のように変換されます*domain.com*。この場合、一致するドキュメントがあります。