次の状況では、GoogleでもESでも完璧な解決策を見つけることができませんでした。誰かがここで助けてくれることを願っています。
フィールド「email」の下に5つの電子メールアドレスが格納されているとします。
1. {"email": "[email protected]"}
2. {"email": "[email protected], [email protected]"}
3. {"email": "[email protected]"}
4. {"email": "[email protected]}
5. {"email": "[email protected]"}
次の検索シナリオを実行したい:
[検索->受信]
"[email protected]"-> 1,2
"[email protected]"-> 2,4
"[email protected]"-> 5
"john.doe"-> 1,2,3,4
「ジョン」-> 1,2,3,4,5
"gmail.com"-> 1,2
"Outlook.com"-> 2,3,4
最初の3つの一致は必須であり、残りの一致についてはより正確であるほど優れています。インデックス/検索アナライザー、トークナイザー、フィルターのさまざまな組み合わせをすでに試しました。また、一致クエリの条件を処理しようとしましたが、理想的な解決策は見つかりませんでした。考えは大歓迎です。マッピング、アナライザー、または使用するクエリの種類に制限はありません。ありがとうございます。
マッピング:
PUT /test
{
"settings": {
"analysis": {
"filter": {
"email": {
"type": "pattern_capture",
"preserve_original": 1,
"patterns": [
"([^@]+)",
"(\\p{L}+)",
"(\\d+)",
"@(.+)",
"([^-@]+)"
]
}
},
"analyzer": {
"email": {
"tokenizer": "uax_url_email",
"filter": [
"email",
"lowercase",
"unique"
]
}
}
}
},
"mappings": {
"emails": {
"properties": {
"email": {
"type": "string",
"analyzer": "email"
}
}
}
}
}
テストデータ:
POST /test/emails/_bulk
{"index":{"_id":"1"}}
{"email": "[email protected]"}
{"index":{"_id":"2"}}
{"email": "[email protected], [email protected]"}
{"index":{"_id":"3"}}
{"email": "[email protected]"}
{"index":{"_id":"4"}}
{"email": "[email protected]"}
{"index":{"_id":"5"}}
{"email": "[email protected]"}
使用するクエリ:
GET /test/emails/_search
{
"query": {
"term": {
"email": "[email protected]"
}
}
}