2

次のマッピングを考えると、次の基準に一致する結果を取得する必要があります

  1. 名、姓、date_of_birth および Active = true の完全一致または
  2. 名、姓、Active = true および可能な倍数のうちの 1 つの電子メールの完全一致 OR
  3. 名、姓、Active = true、可能な倍数のうちの1 つの traveldocument番号の完全一致

電子メールと旅行書類がアイテムのコレクションを参照できる場所。

    {
    "profile":{
        "properties":{

            "date_of_birth":{
                "type":"date",
                "store":"no"
            },
            "first_name":{
                "type":"string",
                "store":"no"
            },
            "last_name":{
                "type":"string",
                "store":"no"
            },
            "email":{
                "type":"string",
                "store":"no"
            },
            "active":{
                "type":"string",
                "store":"no"
            },
            "travel_document":{
              "properties" : {
                   "countryOfCitizenship" : {"type" : "string"},
                   "countryOfIssue" : {"type" : "string"},
                   "expirationDate" : {"type" : "date"},
                   "nationality" : {"type" : "string"},
                   "number" : {"type" : "string"},
                   "addressLines" : {"type": "string"},
                   "issuedForAreaCode" : {"type": "string"},
                   "type" : {"type": "string"}
                }
            }
        }
    }
}

この種の検索をelasticsearchで実行する方法はありますか? ネストされたクエリでこれを行うことはできますか?

4

1 に答える 1

7

はい、できます。

まず、ネストされたクエリに関する質問に答えます。

オブジェクトのコレクション内の同じオブジェクトの複数のフィールドをクエリする必要がある場合(たとえばtravel_document.nationality、タイプごとに変更し、ネストtravel_document.expirationDateされたクエリを使用する必要がある場合。travel_documentobjectnested

与えたクエリの例では、この機能が必要であることを示していません。代わりに、ANYに値があるかどうかを尋ねtravel_documentています。したがって、この場合、ネストされた機能を使用する必要はありません。

(将来、相関フィールドに対してクエリを実行する必要があると思われる場合は、おそらく使用することをお勧めします。ネストされたオブジェクトを個別のオブジェクトとして、およびメインドキュメントの両方でインデックス付けするようにnested設定することもできます)。include_in_rootnested

以下のクエリでtravel_documentは、ネストされていないと仮定しました。

2番目:名前フィールドでの「完全一致」の使用。

デフォルトでは、文字列フィールドが分​​析されるため、「Mary Jane」は、用語['mary'、'jane']としてインデックス付けされます。そのフィールドで「Mary」を探してクエリを実行すると、フィールドには実際に「mary」が含まれているため、一致します。ただし、これは完全に一致するわけではありません。

完全一致を実行する場合は、フィールドを作成する必要がありますnot_analyzed。この場合、「Mary Jane」は単一の用語「MaryJane」としてインデックス付けされ、「Mary」のクエリは一致しません。欠点は、この場合、名前フィールドでフルテキストクエリを使用できないことです。

同様に、電子メールフィールドをnot_analyzedにする(またはkeyword、文字列をトークン化しないトークナイザーとlowercaseトークンフィルターでカスタムアナライザーを使用する)方が理にかなっている場合があります。

以下のクエリでは、名前フィールドは分析されており、電子メールフィールドは分析されていないと仮定しています。

curl -XGET 'http://127.0.0.1:9200/my_index/properties/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "query" : {
            "bool" : {
               "must" : [
                  {
                     "match_phrase" : {
                        "first_name" : "mary jane"
                     }
                  },
                  {
                     "match_phrase" : {
                        "last_name" : "smith"
                     }
                  }
               ]
            }
         },
         "filter" : {
            "and" : [
               {
                  "term" : {
                     "active" : 1
                  }
               },
               {
                  "or" : [
                     {
                        "term" : {
                           "date_of_birth" : "1980-01-01"
                        }
                     },
                     {
                        "terms" : {
                           "email" : [
                              "mary@smith.com",
                              "maryjane@smith.com"
                           ]
                        }
                     },
                     {
                        "terms" : {
                           "travel_document.number" : [
                              "1234",
                              1235
                           ]
                        }
                     }
                  ]
               }
            ]
         }
      }
   }
}
'
于 2013-01-30T10:42:27.653 に答える