Escapes the following terms (because part of the query language)
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ < >.
public static escapeTerm ( string $term ) : string | ||
$term | string | Query term to escape |
Результат | string | Escaped query term |
/** * @param mixed $query * @param string $lang * @param string $type * * @return mixed|void */ public function defineSearch($query, $lang, $type) { $query = \Elastica\Util::escapeTerm($query); $elasticaQueryLang = new \Elastica\Query\Term(); $elasticaQueryLang->setTerm('lang', $lang); $elasticaQueryString = new \Elastica\Query\Match(); $elasticaQueryString->setFieldQuery('content', $query)->setFieldMinimumShouldMatch('content', '80%'); $elasticaQueryTitle = new \Elastica\Query\QueryString(); $elasticaQueryTitle->setDefaultField('title')->setBoost(2.0)->setQuery($query); $elasticaQueryBool = new \Elastica\Query\BoolQuery(); $elasticaQueryBool->addMust($elasticaQueryLang)->addShould($elasticaQueryTitle)->addShould($elasticaQueryString)->setMinimumNumberShouldMatch(1); $this->applySecurityContext($elasticaQueryBool); if (!is_null($type)) { $elasticaQueryType = new \Elastica\Query\Term(); $elasticaQueryType->setTerm('type', $type); $elasticaQueryBool->addMust($elasticaQueryType); } $rootNode = $this->domainConfiguration->getRootNode(); if (!is_null($rootNode)) { $elasticaQueryRoot = new \Elastica\Query\Term(); $elasticaQueryRoot->setTerm('root_id', $rootNode->getId()); $elasticaQueryBool->addMust($elasticaQueryRoot); } $this->query->setQuery($elasticaQueryBool); $this->query->setHighlight(array('pre_tags' => array('<strong>'), 'post_tags' => array('</strong>'), 'fields' => array('content' => array('fragment_size' => 150, 'number_of_fragments' => 3)))); }
/** * {@inheritdoc} */ public function filter(ProxyQueryInterface $query, $alias, $field, $data) { if (!$data || !is_array($data) || !array_key_exists('type', $data) || !array_key_exists('value', $data)) { return; } $data['type'] = !isset($data['type']) ? ChoiceType::TYPE_CONTAINS : $data['type']; list($firstOperator, $secondOperator) = $this->getOperators((int) $data['type']); if (is_array($data['value'])) { if (count($data['value']) == 0) { return; } if (in_array('all', $data['value'], true)) { return; } $queryBuilder = new \Elastica\Query\Builder(); $queryBuilder->fieldOpen($secondOperator)->field($field, Util::escapeTerm($data['value']))->fieldClose(); if ($firstOperator == 'must') { $query->addMust($queryBuilder); } else { $query->addMustNot($queryBuilder); } } else { if ($data['value'] === '' || $data['value'] === null || $data['value'] === false || $data['value'] === 'all') { return; } $queryBuilder = new \Elastica\Query\Builder(); $queryBuilder->fieldOpen($secondOperator)->field($field, Util::escapeTerm(array($data['value'])))->fieldClose(); if ($firstOperator == 'must') { $query->addMust($queryBuilder); } else { $query->addMustNot($queryBuilder); } } }
/** * @group functional */ public function testSearch() { $index = $this->_createIndex(); $index->getSettings()->setNumberOfReplicas(0); $type = new Type($index, 'helloworld'); $doc = new Document(1, array('email' => '*****@*****.**', 'username' => 'test 7/6 123', 'test' => array('2', '3', '5'))); $type->addDocument($doc); // Refresh index $index->refresh(); $queryString = new QueryString(Util::escapeTerm('test 7/6')); $resultSet = $type->search($queryString); $this->assertEquals(1, $resultSet->count()); }
public function testEscapeTermSpecialCharacters() { $before = '\\+-&&||!(){}[]^"~*?:/'; $after = '\\\\\\+\\-\\&&\\||\\!\\(\\)\\{\\}\\[\\]\\^\\"\\~\\*\\?\\:\\\\/'; $this->assertEquals(Util::escapeTerm($before), $after); }