【问题标题】:Elastica filter not workingElastica 过滤器不工作
【发布时间】:2013-05-08 19:32:59
【问题描述】:

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

    $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),
    ));

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

        $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);

添加过滤器

            $elasticaFilterLocation = new \Elastica\Filter\Term();
            //search 'location' = $region;
            $elasticaFilterLocation->setTerm('location', $region);           
            $elasticaQuery->setFilter($elasticaFilterLocation);
            $elasticaResultSet = $elasticaIndex->search($elasticaQuery);                
            $elasticaResults = $elasticaResultSet->getResults();

如果我注释掉过滤器,我会得到预期的结果。我错过了什么?是跟分析器还是映射有关?

【问题讨论】:

    标签: elasticsearch elastica


    【解决方案1】:

    我遇到了同样的问题,我通过更改映射中这些字段的分析器来解决它。现在我必须重建我的索引等......不要试图找到一个解决方案来改变映射或分析器而不重建你的索引,你不能。

    lc_analyzer' => array(
       'type' => 'custom',
       'tokenizer' => 'keyword',
       'filter' => array('lowercase')
    ),
    

    对于映射:

    'location' => array('type' => 'string', 'analyzer' => 'lc_analyzer'),
    

    然后,像这样查询

     $elasticaFilterBool = new \Elastica\Filter\Bool();                
     $filter1 = new \Elastica\Filter\Term();
     $filter1->setTerm('location', array(strtolower($region)));                
     $elasticaFilterBool->addMust($filter1);
     $elasticaQuery->setFilter($elasticaFilterBool);
    

    我认为您的位置被空格和逗号标记,所以它正在扼杀搜索。应该为你解决。

    【讨论】:

    • 你能提供更多细节吗?例如您将分析仪从什么更改为什么?
    • 我使用 2 个自定义分析器 1 用于电子邮件,tokenizer:uax_url_email,另一个用于单词(例如您的位置案例),tokenizer:标准,通过反复试验做了一些事情,因为没有很多文档...如果您需要帮助,请告诉我
    • 是的,请帮忙。我在这里旋转我的车轮无处可去。文档非常稀少。我尝试使用 tokenizer: standard for location 并重建了我的索引,但它仍然返回空。
    • {"index.analysis.analyzer.e_analyzer.tokenizer":"uax_url_email","index.analysis.analyzer.e_analyzer.type":"custom","index.analysis.analyzer.location_analyzer.类型":"custom","index.analysis.analyzer.location_analyzer.tokenizer":"standard","index.analysis.analyzer.location_analyzer.filter.1":"lowercase","index.compression":"true" ,"index.analysis.analyzer.location_analyzer.filter.0":"standard","index.analysis.analyzer.location_analyzer.filter.2":"asciifolding"} 试试这个作为你的索引设置,然后在你的映射中设置位置字段的分析器到 location_analyzer,告诉我好不好
    • 我觉得应该不错:试试 curl -XGET localhost:9200/index_name/_settings 看看设置是否和我一样,然后 curl -XGET localhost:9200/index_name/type_name/_mapping 看看映射是否正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2023-03-21
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多