2013-07-30 83 views
6

Tôi khá mới đối với ES và đang sử dụng nó cho một dự án mới của tôi. Bắt đầu, tôi có một ánh xạ đơn giản cho một khách hàng, có một tên và họ, và một danh sách các đối tượng thông tin thanh toán. Nếu tôi đã làm điều này trong SQL, nó sẽ là một cái gì đó giống như một bảng khách hàng, và một bảng thông tin thanh toán với một mối quan hệ 1: nhiều.ElasticSearch: Tìm kiếm các trường trong mảng lồng nhau

Dưới đây là một ví dụ đơn giản về những gì tôi đang cố gắng để làm: https://gist.github.com/anonymous/6109593

tôi hy vọng sẽ tìm thấy bất kỳ khách hàng dựa trên bất kỳ trận đấu trong mảng lồng nhau của paymentInfos, tức là tìm thấy bất kỳ người dùng đã có một paymentInfo with billingZip 10101. Truy vấn này trả về không có kết quả, và tôi không chắc tại sao. Bất cứ ai có thể chỉ cho tôi đúng hướng là tại sao truy vấn này không hoạt động, và nếu có bất kỳ thay đổi nào tôi có thể thực hiện cho truy vấn hoặc ánh xạ của tôi để nó có trả lại người dùng đúng cách không?

Cảm ơn!

Trả lời

9

lĩnh vực lồng nhau nên đã tìm kiếm sử dụng 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

paymentInfos tại sao đang trở lại với billingzip "20.202", là này bình thường không? –

+0

@OrhanCinar những gì bạn nhận được là nguồn gốc của bản ghi gốc, bao gồm tất cả các trường lồng nhau. – imotov

+0

tôi chỉ có thể lọc con với mã zip 10101, tôi chỉ cần một bản ghi của các trường lồng nhau. Điều này có thể không? –

Các vấn đề liên quan