我正在测试 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();
如果我注释掉过滤器,我确实会得到预期的结果。我缺少什么?它与分析器或映射有关吗?
最佳答案
我遇到了同样的问题,我通过更改映射中这些字段的分析器来修复它。现在我必须重建索引等...不要尝试寻找解决方案来更改映射或分析器而不重建索引,你做不到。
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);
我认为您的位置正在用空格和逗号标记,因此它会杀死搜索。应该可以帮你解决。
关于elasticsearch - 弹性过滤器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448779/