2

クエリ文字列フィルターを使用して電子メール アドレスを検索しているときに、いくつかの興味深い動作に直面しています。

.filteredQuery(
   queryStringQuery(String.format("*%s*", query))
       .field("firstName").field("lastName").field("email").field("phone"),
   null
)

クエリとして渡すdomain.comと(インデックスにそのような値があると仮定)-結果は問題ありませんが、渡すと@domain.com結果は空になります..特殊記号に制限はありますか?

4

1 に答える 1

1

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

于 2015-07-27T09:33:51.540 に答える