首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elastica过滤器和查询数组

Elastica过滤器和查询数组
EN

Stack Overflow用户
提问于 2015-08-20 04:25:08
回答 1查看 1.2K关注 0票数 0

我正在使用表单进行高级搜索。表单输入代表elasticsearch索引中的数据。我的模型接收一组过滤条件和查询条件。

代码语言:javascript
复制
$data = array(
  'Filter' => array(
    'FilerId' => 14592
  ),
  'Query' => array(
    'FiledDate' => '2015-08-06',
  ),
);

我使用foreach循环来创建过滤器和查询

代码语言:javascript
复制
foreach ($data['Filter'] AS $field => $value) {
    $filter = new \Elastica\Filter\Term();
    $filter->setTerm($field, $value); 
    $filterArray[] = $filter;

}

foreach ($data['Query'] AS $field => $value) {
    $query = new \Elastica\Query\QueryString($value);
    $query->setDefaultOperator('AND')
          ->setDefaultField($field);
    $queryArray[] = $query;

}

$query = new \Elastica\Query();
$query
    ->setFields(['TranId'])
    ->setQuery($queryArray)
    ->setFilter($filterArray);

$search->setQuery($query);


$numberOfEntries = $search->count();
$comma_separated = 0;
if ($numberOfEntries) {
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) {
        $results = $resultSet->getResults();
        $totalResults = $resultSet->getTotalHits();

        foreach ($results as $result) {
            $fields = $result->getFields('TransId');
            $transid[] = $fields['TranId'][0];
        }    // ... handle Elastica\ResultSet
    }
    $comma_separated = implode(", ", $transid);
}
return array('transactions' => $comma_separated, 'total' => $totalResults);

我收到一个错误,但我找不到原因?

下面是一些更新后的代码。我得到了结果,但并不是我认为我应该得到的结果。

代码语言:javascript
复制
$boolFilter = new \Elastica\Filter\BoolFilter();

foreach ($data['Filter'] AS $field => $value) {
    $term = new \Elastica\Filter\Term();
    $term->setTerm($field, $value); 
    $boolFilter->addMust($term);
}

$boolQuery = new \Elastica\Query\BoolQuery();

foreach ($data['Query'] AS $field => $value) {
    $match = new \Elastica\Query\Match();
    $match->setFieldQuery($field, $value)
          ->setFieldAnalyzer($field, 'whitespace')
          ->setFieldOperator($field, 'AND'); 
    $boolQuery->addMust($match);
}

$query = new \Elastica\Query();
$query
    ->setFields(['TranId'])
    ->setQuery($boolQuery)
    ->setFilter($boolFilter);
//print $error->getError();
print "<pre>";
print_r ($query->toArray());
print "</pre>";
$search->setQuery($query);

$numberOfEntries = $search->count();
$comma_separated = 0;
if ($numberOfEntries) {
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) {
        $results = $resultSet->getResults();
        $totalResults = $resultSet->getTotalHits();

        foreach ($results as $result) {
            $fields = $result->getFields('TransId');
            $transid[] = $fields['TranId'][0];
        }    // ... handle Elastica\ResultSet
    }
    $comma_separated = implode(", ", $transid);
    }
    return array('transactions' => $comma_separated, 'total' => $totalResults);
EN

回答 1

Stack Overflow用户

发布于 2015-08-20 08:26:31

好了!我需要添加标准分析器,而不是空白分析器。空格分析器工作,但只在空格中拆分短语。标准分析器将短语拆分,并使大小写更低。

https://www.elastic.co/guide/en/elasticsearch/guide/current/analysis-intro.html#analyze-api

代码语言:javascript
复制
$boolFilter = new \Elastica\Filter\BoolFilter();

foreach ($data['Filter'] AS $field => $value) {
    $term = new \Elastica\Filter\Term();
    $term->setTerm($field, $value); 
    $boolFilter->addMust($term);
}

$boolQuery = new \Elastica\Query\BoolQuery();

foreach ($data['Query'] AS $field => $value) {
    $match = new \Elastica\Query\Match($value);
    $match->setFieldQuery($field, $value); 
    $match->setFieldAnalyzer($field, 'standard');
    $boolQuery->addMust($match);
}

$filterQuery = new \Elastica\Query\Filtered();
$filterQuery->setFilter($boolFilter);
$filterQuery->setQuery($boolQuery);

$query = new \Elastica\Query($filterQuery);
$query->setFields(['TranId']);

print "<pre>";
print_r ($query->toArray());
print "</pre>";

$search->setQuery($query);

$numberOfEntries = $search->count();
$comma_separated = 0;
if ($numberOfEntries) {
    foreach ($search->scanAndScroll() as $scrollId => $resultSet) {
        $results = $resultSet->getResults();
        $totalResults = $resultSet->getTotalHits();

        foreach ($results as $result) {
            $fields = $result->getFields('TransId');
            $transid[] = $fields['TranId'][0];
        }    // ... handle Elastica\ResultSet
    }
    $comma_separated = implode(", ", $transid);
    }
    return array('transactions' => $comma_separated, 'total' => $totalResults);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32105006

复制
相关文章

相似问题

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