Сочетание двух разных фильтров в одном запросе - Elastica

мой вопрос очень простой. Я хочу объединить два фильтра, один filter_bool и один filter_range в одном запросе в Elastica. Код

public function getAdvancedTweetsEs($keyword, $location, $datepicker, $datepicker1, $offset)
{
    $elasticaClient = new Elastica_Client();

    // Load index
    $elasticaIndex = $elasticaClient->getIndex('mongoindex3');

    // Define a Query. We want a string query.
    $elasticaQueryString = new Elastica_Query_QueryString();
    //$elasticaQueryString->setDefaultOperator('AND');
    $elasticaQueryString->setQuery($keyword);

    // Create the actual search object with some data.
    $elasticaQuery = new Elastica_Query();
    $elasticaQuery->setQuery($elasticaQueryString);
    $elasticaQuery->setFrom(0);
    $elasticaQuery->setLimit($offset);

    //Set a filter in text
    $elasticaFilterBool = new Elastica_Filter_Bool();                
    $filter1 = new Elastica_Filter_Term();
    $filter2 = new Elastica_Filter_Term();
    $filter1->setTerm('text', array(strtolower($keyword)));
    $filter2->setTerm('location', array(strtolower($location)));        
    $elasticaFilterBool->addMust($filter1);
    $elasticaFilterBool->addMust($filter2);
    $elasticaQuery->setFilter($elasticaFilterBool);

    $range = new Elastica_Query_Range();
    $range->addField('date', 
                        array(  'from' => $datepicker,
                                'to' => $datepicker1
                             ) 
                     );                 

    //Search on the index.
    $elasticaResultSet = $elasticaIndex->search($elasticaQuery);

    $elasticaResults = $elasticaResultSet->getResults();

    $results = array();

    foreach ($elasticaResults as $elasticaResult) 
    {   
        $results[] = $elasticaResult->getData();
    }

    return $results;
}

Я не могу объединить два фильтра в $elasticaQuery. Пожалуйста, буду признателен за любую помощь!

Спасибо!


person Dimitris Tsarouhas    schedule 07.09.2013    source источник


Ответы (1)


Почему бы вам не добавить фильтр диапазона в качестве еще одного термина must в фильтре bool:

$rangeFilter = new Elastica_Filter_Range();
$rangeFilter->addField('date', 
                    array(  'from' => $datepicker,
                            'to' => $datepicker1
                         ) 
                 ); 
$elasticaFilterBool->addMust($rangeFilter);
$elasticaQuery->setFilter($elasticaFilterBool);

Вам нужно использовать фильтры, а не запросы, в логическом фильтре. Обратите внимание, что я использовал Elastica_Filter_Range вместо запроса диапазона, который вы использовали.

Кроме того, вы знаете, что используете устаревшую версию Elastica, а новые используют пространства имен!

person ramseykhalaf    schedule 07.09.2013
comment
Спасибо! Вы абсолютно правы! Построение запроса и его фильтров полностью корректно, но указанный диапазон дат не распознается. В моем отображении дата представляет собой строку. Что я могу сделать? Дата в моем средстве выбора даты, например, 06.09.13, и в том же формате хранится в моей базе данных. - person Dimitris Tsarouhas; 08.09.2013
comment
Вам необходимо указать формат даты в сопоставлении, если вы не используете формат по умолчанию. Если вы используете формат по умолчанию, elasticsearch автоматически отобразит его как дату. посмотрите на этот вопрос/ответ, он должен вам помочь. - person ramseykhalaf; 09.09.2013
comment
Я использую MongoDB для своей базы данных, поэтому сопоставление было создано автоматически с помощью elasticsearch-mongodb-river (github. com/richardwilly98/elasticsearch-river-mongodb). Таким образом, дата автоматически характеризовалась как строка. Теперь мне нужно найти способ превратить шрифт в дату. Еще раз спасибо! - person Dimitris Tsarouhas; 09.09.2013
comment
Вы не можете изменить сопоставление поля, которое уже было проиндексировано. Если вы можете, вам нужно использовать API сопоставления `put для отправки сопоставления до того, как река отправит данные, а elsaticsearch попытается угадать (ошибочно) сопоставление. - person ramseykhalaf; 09.09.2013
comment
Наконец, я раскрыл дело. Итак, что я сделал. Прежде всего, я использую elasticsearch-head-master (github.com/mobz/elasticsearch-head), чтобы посмотреть на мои индексы elasticsearch и их состояние. Итак, я удалил предыдущий индекс с неправильным отображением. Я сделал новый индекс и с правильным отображением, а затем подключил MongoDB к elasticsearch через реку. Новое сопоставление было выполнено успешно, и мой фильтр диапазона наконец-то работает нормально! еще раз спасибо! - person Dimitris Tsarouhas; 09.09.2013