2015-08-19 2 views
0

Я пользуюсь формой для расширенного поиска. Входы формы представляют данные в индексе elasticsearch. Моя модель получает множество условий фильтрации и условий запроса.Elastica Filter and Query Array

$data = array(
    'Filter' => array(
    'FilerId' => 14592 
), 
    'Query' => array(
    'FiledDate' => '2015-08-06', 
), 
); 

Я использую цикл Еогеасп для создания фильтра и запроса

foreach ($data['Filter'] AS $field => $value) { 
    $filter = new \Elastica\Filter\Term(); 
    $filter->setTerm($field, $value); 
    $filterArray[] = $filter; 

} 

foreach ($data['Query'] AS $field => $value) { 
    $query = new \Elastica\Query\QueryString($value); 
    $query->setDefaultOperator('AND') 
      ->setDefaultField($field); 
    $queryArray[] = $query; 

} 

$query = new \Elastica\Query(); 
$query 
    ->setFields(['TranId']) 
    ->setQuery($queryArray) 
    ->setFilter($filterArray); 

$search->setQuery($query); 


$numberOfEntries = $search->count(); 
$comma_separated = 0; 
if ($numberOfEntries) { 
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) { 
     $results = $resultSet->getResults(); 
     $totalResults = $resultSet->getTotalHits(); 

     foreach ($results as $result) { 
      $fields = $result->getFields('TransId'); 
      $transid[] = $fields['TranId'][0]; 
     } // ... handle Elastica\ResultSet 
    } 
    $comma_separated = implode(", ", $transid); 
} 
return array('transactions' => $comma_separated, 'total' => $totalResults); 

Я получаю сообщение об ошибке, и я не могу найти причину, почему?

Вот обновленный код. Я получаю результаты, но не то, что, как я думал, должен получить.

$boolFilter = new \Elastica\Filter\BoolFilter(); 

foreach ($data['Filter'] AS $field => $value) { 
    $term = new \Elastica\Filter\Term(); 
    $term->setTerm($field, $value); 
    $boolFilter->addMust($term); 
} 

$boolQuery = new \Elastica\Query\BoolQuery(); 

foreach ($data['Query'] AS $field => $value) { 
    $match = new \Elastica\Query\Match(); 
    $match->setFieldQuery($field, $value) 
      ->setFieldAnalyzer($field, 'whitespace') 
      ->setFieldOperator($field, 'AND'); 
    $boolQuery->addMust($match); 
} 

$query = new \Elastica\Query(); 
$query 
    ->setFields(['TranId']) 
    ->setQuery($boolQuery) 
    ->setFilter($boolFilter); 
//print $error->getError(); 
print "<pre>"; 
print_r ($query->toArray()); 
print "</pre>"; 
$search->setQuery($query); 

$numberOfEntries = $search->count(); 
$comma_separated = 0; 
if ($numberOfEntries) { 
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) { 
     $results = $resultSet->getResults(); 
     $totalResults = $resultSet->getTotalHits(); 

     foreach ($results as $result) { 
      $fields = $result->getFields('TransId'); 
      $transid[] = $fields['TranId'][0]; 
     } // ... handle Elastica\ResultSet 
    } 
    $comma_separated = implode(", ", $transid); 
    } 
    return array('transactions' => $comma_separated, 'total' => $totalResults); 
+0

Пожалуйста, скажите всем, что ошибка, которую вы получаете, поэтому мы не должны догадаться. – crafter

ответ

1

Хорошо! Мне нужно было добавить стандартный анализатор вместо анализатора пробелов. Анализатор пробелов работает, но только фразы разбиваются на пробелы. Стандартный анализатор разбивает фразу и делает регистр ниже.

https://www.elastic.co/guide/en/elasticsearch/guide/current/analysis-intro.html#analyze-api

$boolFilter = new \Elastica\Filter\BoolFilter(); 

foreach ($data['Filter'] AS $field => $value) { 
    $term = new \Elastica\Filter\Term(); 
    $term->setTerm($field, $value); 
    $boolFilter->addMust($term); 
} 

$boolQuery = new \Elastica\Query\BoolQuery(); 

foreach ($data['Query'] AS $field => $value) { 
    $match = new \Elastica\Query\Match($value); 
    $match->setFieldQuery($field, $value); 
    $match->setFieldAnalyzer($field, 'standard'); 
    $boolQuery->addMust($match); 
} 

$filterQuery = new \Elastica\Query\Filtered(); 
$filterQuery->setFilter($boolFilter); 
$filterQuery->setQuery($boolQuery); 

$query = new \Elastica\Query($filterQuery); 
$query->setFields(['TranId']); 

print "<pre>"; 
print_r ($query->toArray()); 
print "</pre>"; 

$search->setQuery($query); 

$numberOfEntries = $search->count(); 
$comma_separated = 0; 
if ($numberOfEntries) { 
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) { 
     $results = $resultSet->getResults(); 
     $totalResults = $resultSet->getTotalHits(); 

     foreach ($results as $result) { 
      $fields = $result->getFields('TransId'); 
      $transid[] = $fields['TranId'][0]; 
     } // ... handle Elastica\ResultSet 
    } 
    $comma_separated = implode(", ", $transid); 
    } 
    return array('transactions' => $comma_separated, 'total' => $totalResults); 
+0

Образец идеального эластичного фильтра. – Sattu