2014-03-31 64 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();