2014-03-31 106 views
2

我在彈性搜索索引中創建了一個小數據集(目前只有8個項目)。PHP Elastica過濾搜索在預期時不返回結果

中的條目的結構如下

{ 
    "value_a": "Foo", 
    "value_b": "Bar", 
    "value_c": "Baz" 
} 

在彈性搜索本然後如下所示(從直接查詢我的彈性搜索端點截取):

{ 
    "_index": "foo_bar_bazindex", 
    "_type": "foo_bar_baz", 
    "_id": "4", 
    "_score": 1, 
    "_source": { 
     "value_a": "Foo", 
     "value_b": "Bar", 
     "value_c": "Baz" 
    } 
} 

的值A,B的組合和c是獨一無二的。

我想通過使用值a和b執行bool過濾搜索來查找「value_c」的值。

在我的代碼我一直想這個如下:

$filter = new \Elastica\Filter\Bool(); 
    $query = new \Elastica\Query(); 

    $aFilter = new \Elastica\Filter\Term(['value_a' => "Foo"]); 
    $bFilter = new \Elastica\Filter\Term(['value_b' => "Bar"]); 

    $filter->addMust($aFilter); 
    $filter->addMust($bFilter); 

    $query->setFilter($filter); 

    $results = $this->bookingPeriodIndex->search($query)->getResults(); 

    var_dump($results); 

然而,這不返回任何結果(VAR轉儲輸出空數組) - 通過直接發佈此查詢到服務器也可手動嘗試此查詢:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "term": { 
           "value_a": "Foo" 
          } 
         }, 
         { 
          "term": { 
           "value_b": "Bar" 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

這也產生了沒有結果 - 但是我希望它返回一個結果,因爲我有如下條目:

{ 
    "value_a": "Foo", 
    "value_b": "Bar", 
    "value_c": "Baz" 
} 

我錯過了什麼嗎?這可能是由於小數據集?我們在代碼庫中的其他地方使用相同的Bool Filter Elastica查詢,並且這些工作如預期的那樣工作,但是我似乎無法從此索引中獲取任何數據。

任何幫助,將不勝感激。

回答

1

在我得到的結果,我通過使用布爾查詢有兩個匹配語句尋找結束:

原始查詢:

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "match": { 
         "value_a": "Foo" 
        } 
       }, 
       { 
        "match": { 
         "value_b": "Bar" 
        } 
       } 
      ] 
     } 
    } 
} 

使用彈性曲線查詢:

$query = new Query; 
$booleanQuery = new Bool(); 

$fooMatch = new Match(); 
$fooMatch->setField('value_a', 'Foo'); 
$booleanQuery->addMust($fooMatch); 

$barMatch = new Match(); 
$barMatch->setField('value_b', 'Bar'); 
$booleanQuery->addMust($barMatch); 

$query->setQuery($booleanQuery); 

$results = $this->index->search($query)->getResults();