7

次の ElasticSearch クエリがあります。これは、 myemails@email.comに等しい電子メールフィールドですべての一致を返すと思います。

"query": {
  "bool": {
    "must": [
      {
        "match": {
          "email": "myemail@gmail.com"
      }
    }
  ]
}

}

検索されるユーザータイプのマッピングは次のとおりです。

    {
      "users": {
      "mappings": {
         "user": {
            "properties": {
               "email": {
                  "type": "string"
               },
               "name": {
                  "type": "string",
                  "fields": {
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               },
               "nickname": {
                  "type": "string"
               },
            }
         }
       }
   }  
     }

以下は、ElasticSearch から返される結果のサンプルです。

 [{
    "_index": "users",
    "_type": "user",
    "_id": "54b19c417dcc4fe40d728e2c",
    "_score": 0.23983537,
    "_source": {
    "email": "johnsmith@gmail.com",
    "name": "John Smith",
    "nickname": "jsmith",
 },
 {
    "_index": "users",
    "_type": "user",
    "_id": "9c417dcc4fe40d728e2c54b1",
    "_score": 0.23983537,
    "_source": {
       "email": "myemail@gmail.com",
       "name": "Walter White",
       "nickname": "wwhite",
 },
 {
    "_index": "users",
    "_type": "user",
    "_id": "4fe40d728e2c54b19c417dcc",
    "_score": 0.23983537,
    "_source": {
       "email": "JimmyFallon@gmail.com",
       "name": "Jimmy Fallon",
       "nickname": "jfallon",
}]

上記のクエリから、email プロパティ値として「myemail@gmail.com」と完全に一致する必要があると思います。

電子メールで完全一致のみを返すには、ElasticSearch DSL クエリをどのように変更する必要がありますか。

4

1 に答える 1

12

電子メール フィールドがトークン化されました。これがこの異常の原因です。何が起こったのかは、インデックスを作成したときです

"myemail@gmail.com" => [ "myemail" , "gmail.com" ]

このようにして、myemail または gmail.com を検索すると、一致が得られます。john@gmail.com を検索すると、アナライザーは検索クエリにも適用されます。したがって、それはに壊れます

"john@gmail.com" => [ "john" , "gmail.com" ]

ここでは、"gmail.com" トークンが検索語と索引語で共通しているため、一致が得られます。

この動作を上書きするには、電子メールを宣言します。フィールドを not_analyzed として。そこでトークン化は行われず、文字列全体がそのようにインデックス化されます。

「not_analyzed」あり

"john@gmail.com" => [ "john@gmail.com" ]

したがって、マッピングをこれに変更すると、うまくいくはずです-

{
  "users": {
    "mappings": {
      "user": {
        "properties": {
          "email": {
            "type": "string",
            "index": "not_analyzed"
          },
          "name": {
            "type": "string",
            "fields": {
              "raw": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "nickname": {
            "type": "string"
          }
        }
      }
    }
  }
}

問題をより正確に説明し、それを解決するための別のアプローチをここで説明しました。

于 2015-01-12T05:30:45.007 に答える