2016-10-14 78 views
1

我使用FOSElasticaBundle將我的symfony3項目與elasticsearch集成。我有一個映射類似於:foselasticabundle嵌套查詢

company: 
    mappings: 
     id: { boost: 1, type: string, index: not_analyzed } 
     cik: { boost: 2, type: string, index: not_analyzed } 
     conformedName: { boost: 6, analyzer: custom_analyzer } 
     assignedSIC: 
      type: object 
      properties: 
       id: { type: string, index: not_analyzed } 
       code: { type: string, index: not_analyzed } 
       title: { analyzer: custom_analyzer } 
     businessAddress: 
      type: object 
      properties: 
       street1: { analyzer: custom_analyzer } 
       street2: { analyzer: custom_analyzer } 
       city: { analyzer: custom_analyzer } 
       state: { analyzer: custom_analyzer } 
       zip: { type: string, index: not_analyzed } 
       phone: { type: string, index: not_analyzed } 

我想按城市,州和zip嵌套的businessAddress屬性過濾。

我有這個疑問:

$boolQuery = new BoolQuery(); 
$cityQuery = new Match(); 
$cityQuery->setFieldQuery('businessAddress.city', array($city])); 
$cityQuery->setFieldParam('businessAddress.city', 'analyzer', 'custom_analyzer'); 
$boolQuery->addMust($cityQuery); 
$this->finder->find($boolQuery); 

JSON查詢作爲

{"query":{"bool":{"must":[{"match":{"businessAddress.city":{‌​"query":["NY"],"anal‌​yzer":"custom_analyz‌​er"}}}]}}} 

但有0的結果,我不知道,如果sintax businessAddress.city將由束自動處理還是我需要創建一個嵌套查詢。如果這是一個嵌套的查詢如何我可以建立呢?

編輯

一些意見後,下面我發現我設置匹配項的數組,現在我改變來自:

$cityQuery->setFieldQuery('businessAddress.city', array($city])); 

$cityQuery->setFieldQuery('businessAddress.city', $city]); 

導致對JSON查詢:

{"query":{"bool":{"must":[{"match":{"businessAddress.state":{"query":"NY","analyzer":"custom_analyzer"}}}]}}} 

我已經通過互聯網查詢,什麼也沒找到。

請幫忙。謝謝

+0

你可以將'$ boolQuery'導出爲json。你可以使用' - > toArray()'方法。這裏 – hkulekci

+0

@hkulekci是{ 「查詢」:{ 「布爾」:{ 「必須」:[{ 「匹配」:{ 「businessAddress.city」:{ 「查詢」: 「NY」], 「分析」:」 custom_analyzer「}}}]}}} – bitgandtter

+0

該查詢直接在elasticsearch中不起作用。匹配查詢在搜索時不支持數組值。你能檢查你的查詢的錯誤迴應嗎? Elastica是否返回任何錯誤? – hkulekci

回答

0

以下是如何使用嵌套查詢來實現它。

所有你需要更新你的映射首先,讓您的businessAddress一種nested

... 
    businessAddress: 
     type: nested 
... 

然後你就可以執行以下Nested查詢

$boolQuery = new BoolQuery(); 
$cityQuery = new Match(); 
$cityQuery->setFieldQuery('businessAddress.city', array($city])); 
$cityQuery->setFieldParam('businessAddress.city', 'analyzer', 'custom_analyzer'); 
$boolQuery->addMust($cityQuery); 
// nested query 
$query = new Nested(); 
$query->setPath('businessAddress'); 
$query->setQuery($boolQuery); 
// pass the nested query to your finder 
$this->finder->find($query); 

希望這有助於

+0

請注意,如果你在你的對手只有一個條件查詢'BoolQuery'不是強制性的 –