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*
。この場合、一致するドキュメントがあります。