【问题标题】:Combination of two different filters in one Query - Elastica在一个查询中组合两种不同的过滤器 - Elastica
【发布时间】:2013-09-07 08:51:16
【问题描述】:

我的问题很简单。我想在 Elastica 的一个查询中组合两个过滤器,一个 filter_bool 和一个 filter_range。代码是

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 中将两个过滤器放在一起。如有任何帮助,我将不胜感激!

谢谢!

【问题讨论】:

    标签: php codeigniter elasticsearch elastica


    【解决方案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,新版本使用命名空间!

    【讨论】:

    • 谢谢!你完全正确!查询及其过滤器的构建是完全正确的,但仍然无法识别我给出的日期范围。在我的映射日期中是一个字符串。我能做些什么?我的日期选择器中的日期例如是“09/06/13”,并且以相同的格式存储到我的数据库中。
    • 如果您不使用默认格式,则需要在映射中指定日期格式。如果您使用默认格式,elasticsearch 会自动将其映射为日期。有一个look at this question/answer,它应该可以帮助你。
    • 我使用 MongoDB 作为我的数据库,所以映射是由 elasticsearch-mongodb-river (github.com/richardwilly98/elasticsearch-river-mongodb) 自动创建的。所以日期被自动表征为字符串。现在我必须想办法把类型变成日期。再次感谢!
    • 您无法更改已建立索引的字段的映射。如果可以的话,您需要在河流发送数据和 elsaticsearch 尝试(错误地)猜测映射之前使用“放置映射 API”发送映射。
    • 终于,我解决了这个案子。所以,我做了什么。首先,我使用 elasticsearch-head-master (github.com/mobz/elasticsearch-head),以查看我的 elasticsearch 索引及其状况。所以,我用错误的映射删除了以前的索引。我创建了一个新索引并使用了正确的映射,然后通过河流将 MongoDB 与 elasticsearch 连接起来。新映射成功,我的范围过滤器终于可以正常工作了!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多