首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elastica过滤器不工作

Elastica过滤器不工作
EN

Stack Overflow用户
提问于 2013-05-09 03:32:59
回答 1查看 3.9K关注 0票数 2

我正在测试Elastica和Elastic Search。我正在尝试向我的查询添加一个过滤器,该过滤器只按城市位置返回结果。它返回为空。我尝试过按用户名过滤,等等,结果总是返回空,所以我的理解似乎不太正确。这是我的代码,用于分析、映射,然后使用过滤器进行搜索

代码语言:javascript
复制
    $elasticaIndex = $elasticaClient->getIndex('users');
    // Create the index new
    $elasticaIndex->create(
            array(
        'analysis' => array(
            'analyzer' => array(
                'indexAnalyzer' => array(
                    'type' => 'custom',
                    'tokenizer' => 'standard',
                    'filter' => array('lowercase', 'lb_ngram')
                ),
                'searchAnalyzer' => array(
                    'type' => 'custom',
                    'tokenizer' => 'standard',
                    'filter' => array('standard', 'lowercase', 'lb_ngram')
                )
            ),
            'filter' => array(
                'lb_ngram' => array(
                    "max_gram" => 10,
                    "min_gram" => 1,
                    "type" => "nGram"
                )
            )
        )
            ), true
    );
    //Create a type
    $elasticaType = $elasticaIndex->getType('profile');


    // Set mapping
    $mapping->setProperties(array(
        //'id' => array('type' => 'integer', 'include_in_all' => FALSE),
        'firstName' => array('type' => 'string', 'include_in_all' => TRUE),
        'lastName' => array('type' => 'string', 'include_in_all' => TRUE),
        'username' => array('type' => 'string', 'include_in_all' => TRUE),
        'bio' => array('type' => 'string', 'include_in_all' => TRUE),
        'thumbnail' => array('type' => 'string', 'include_in_all' => FALSE),
        'location' => array('type' => 'string', 'include_in_all' => TRUE),
    ));

.然后,为了进行搜索,我执行以下操作

代码语言:javascript
复制
        $elasticaQueryString = new Elastica\Query\QueryString();

        //'And' or 'Or' default : 'Or'
        $elasticaQueryString->setDefaultOperator('AND');
        $elasticaQueryString->setQuery($term);

        // Create the actual search object with some data.
        $elasticaQuery = new Elastica\Query();
        $elasticaQuery->setQuery($elasticaQueryString);

添加过滤器的步骤

代码语言:javascript
复制
            $elasticaFilterLocation = new \Elastica\Filter\Term();
            //search 'location' = $region;
            $elasticaFilterLocation->setTerm('location', $region);           
            $elasticaQuery->setFilter($elasticaFilterLocation);
            $elasticaResultSet = $elasticaIndex->search($elasticaQuery);                
            $elasticaResults = $elasticaResultSet->getResults();

如果我注释掉过滤器,我确实会得到预期的结果。我遗漏了什么?这与分析器或映射有关吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-10 19:31:23

我也有同样的问题,我通过更改映射中这些字段的分析器来修复它。现在我必须重建我的索引,等等。不要试图在不重新构建索引的情况下找到更改映射或分析器的解决方案,这是行不通的。

代码语言:javascript
复制
lc_analyzer' => array(
   'type' => 'custom',
   'tokenizer' => 'keyword',
   'filter' => array('lowercase')
),

对于映射:

代码语言:javascript
复制
'location' => array('type' => 'string', 'analyzer' => 'lc_analyzer'),

然后,查询如下

代码语言:javascript
复制
 $elasticaFilterBool = new \Elastica\Filter\Bool();                
 $filter1 = new \Elastica\Filter\Term();
 $filter1->setTerm('location', array(strtolower($region)));                
 $elasticaFilterBool->addMust($filter1);
 $elasticaQuery->setFilter($elasticaFilterBool);

我认为你的位置被标记在空格和逗号上,所以这会扼杀搜索。应该能帮你解决这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16448779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档