2013-07-30 9 views
6

私はESをかなり使い慣れていて、新しいプロジェクトに使っています。まず、姓と名義の顧客と、支払い情報オブジェクトのリストを持つシンプルなマッピングがあります。私がSQLでこれをやっていたのであれば、それは顧客テーブルのようなものであり、1:多くの関係を持つ支払い情報テーブルのようなものです。私はつまり、持っていたすべてのユーザーを見つけ、paymentInfosのネストされた配列のいずれかの一致に基づいてすべての顧客を見つけることを望んでいるhttps://gist.github.com/anonymous/6109593ElasticSearch:ネストされた配列のフィールドを検索する

:ここ

は、私が何をしようとしているの単純な例ですpaymentInfo with billingZip 10101.このクエリは結果を返しません。理由はわかりません。誰でも正しい方向に私がこのクエリがうまくいかない理由を教えてもらえますか?また、変更があった場合、クエリやマッピングを使ってユーザーを適切に返すことができますか?

ありがとうございます!

答えて

9

ネストされたフィールドはnested queryを使用して検索する必要があります。

echo "Deleting old ElasticSearch index..." 
curl -XDELETE 'localhost:9200/arrtest' 
echo 
echo "Creating new ElasticSearch index..." 
curl -XPUT 'localhost:9200/arrtest/?pretty=1' -d '{ 
    "mappings" : { 
     "cust2" : { 
     "properties" : { 
      "firstName" : { 
       "type" : "string", 
       "analyzer" : "string_lowercase" 
      }, 
      "lastName" : { 
       "type" : "string", 
       "analyzer" : "string_lowercase" 
      }, 
      "paymentInfos": { 
       "properties": { 
        "billingZip": { 
         "type": "string", 
         "analyzer": "string_lowercase" 
        }, 
        "paypalEmail": { 
         "type": "string", 
         "analyzer": "string_lowercase" 
        } 
       }, 
       "type": "nested" 
      } 
     } 
     } 
    }, 

    "settings" : { 
     "analysis" : { 
     "analyzer" : { 
      "uax_url_email" : { 
       "filter" : [ "standard", "lowercase" ], 
       "tokenizer" : "uax_url_email" 
      }, 

      "string_lowercase": { 
       "tokenizer" : "keyword", 
       "filter" : "lowercase" 
      } 
     } 
     } 
    } 
} 
' 
echo 
echo "Index recreation finished" 

echo "Inserting one record..." 
curl -XPUT 'localhost:9200/arrtest/cust2/1' -d '{ 
    "firstName": "john", 
    "lastName": "smith", 

    "paymentInfos": [{ 
     "billingZip": "10101", 
     "paypalEmail": "[email protected]" 
    }, { 
     "billingZip": "20202", 
     "paypalEmail": "[email protected]" 
    }] 
} 
' 
echo 
echo "Refreshing index to make new records searchable" 
curl -XPOST 'localhost:9200/arrtest/_refresh' 
echo 
echo "Searching for record..." 
curl -XGET 'localhost:9200/arrtest/cust2/_search?pretty=1' -d '{ 
    "sort": [], 
    "query": { 
     "bool": { 
      "should": [], 
      "must_not": [], 
      "must": [{ 
       "nested": { 
        "query": { 
         "query_string": { 
          "fields": ["paymentInfos.billingZip"], 
          "query": "10101" 
         } 
        }, 
        "path": "paymentInfos" 
       } 
      }] 
     } 
    }, 
    "facets": {}, 
    "from": 0, 
    "size": 25 
}' 
echo 
+0

なぜbillingzip "20202" とpaymentInfosを返して、これは正常ですか? –

+0

@OrhanCinar元に戻ったものは元のレコードのソースで、すべてのネストされたフィールドが含まれます。 – imotov

+0

ジップ10101の子のみをフィルタリングできますが、ネストされたフィールドのレコードは1つだけ必要です。これは可能ですか? –

関連する問題