Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Match.php
Go to the documentation of this file.
1 <?php
7 
14 use Magento\Framework\Search\Request\QueryInterface as RequestQueryInterface;
16 
25 class Match implements QueryInterface
26 {
27  const SPECIAL_CHARACTERS = '-+~/\\<>\'":*$#@()!,.?`=%&^';
28 
30 
34  private $replaceSymbols = [];
35 
39  private $resolver;
40 
44  private $fulltextHelper;
45 
49  private $fulltextSearchMode;
50 
55  protected $preprocessors;
56 
63  public function __construct(
64  ResolverInterface $resolver,
65  Fulltext $fulltextHelper,
66  $fulltextSearchMode = Fulltext::FULLTEXT_MODE_BOOLEAN,
67  array $preprocessors = []
68  ) {
69  $this->resolver = $resolver;
70  $this->replaceSymbols = str_split(self::SPECIAL_CHARACTERS, 1);
71  $this->fulltextHelper = $fulltextHelper;
72  $this->fulltextSearchMode = $fulltextSearchMode;
73  $this->preprocessors = $preprocessors;
74  }
75 
79  public function build(
80  ScoreBuilder $scoreBuilder,
82  RequestQueryInterface $query,
83  $conditionType
84  ) {
86  $queryValue = $this->prepareQuery($query->getValue(), $conditionType);
87 
88  $fieldList = [];
89  foreach ($query->getMatches() as $match) {
90  $fieldList[] = $match['field'];
91  }
92  $resolvedFieldList = $this->resolver->resolve($fieldList);
93 
94  $fieldIds = [];
95  $columns = [];
96  foreach ($resolvedFieldList as $field) {
97  if ($field->getType() === FieldInterface::TYPE_FULLTEXT && $field->getAttributeId()) {
98  $fieldIds[] = $field->getAttributeId();
99  }
100  $column = $field->getColumn();
101  $columns[$column] = $column;
102  }
103 
104  $matchQuery = $this->fulltextHelper->getMatchQuery(
105  $columns,
106  $queryValue,
107  $this->fulltextSearchMode
108  );
109  $scoreBuilder->addCondition($matchQuery, true);
110 
111  if ($fieldIds) {
112  $matchQuery = sprintf('(%s AND search_index.attribute_id IN (%s))', $matchQuery, implode(',', $fieldIds));
113  }
114 
115  $select->where($matchQuery);
116 
117  return $select;
118  }
119 
127  protected function prepareQuery($queryValue, $conditionType)
128  {
129  $queryValue = str_replace($this->replaceSymbols, ' ', $queryValue);
130  foreach ($this->preprocessors as $preprocessor) {
131  $queryValue = $preprocessor->process($queryValue);
132  }
133 
134  $stringPrefix = '';
135  if ($conditionType === BoolExpression::QUERY_CONDITION_MUST) {
136  $stringPrefix = '+';
137  } elseif ($conditionType === BoolExpression::QUERY_CONDITION_NOT) {
138  $stringPrefix = '-';
139  }
140 
141  $queryValues = explode(' ', $queryValue);
142 
143  foreach ($queryValues as $queryKey => $queryValue) {
144  if (empty($queryValue)) {
145  unset($queryValues[$queryKey]);
146  } else {
147  $stringSuffix = self::MINIMAL_CHARACTER_LENGTH > strlen($queryValue) ? '' : '*';
148  $queryValues[$queryKey] = $stringPrefix . $queryValue . $stringSuffix;
149  }
150  }
151 
152  $queryValue = implode(' ', $queryValues);
153 
154  return $queryValue;
155  }
156 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
__construct(ResolverInterface $resolver, Fulltext $fulltextHelper, $fulltextSearchMode=Fulltext::FULLTEXT_MODE_BOOLEAN, array $preprocessors=[])
Definition: Match.php:63
$columns
Definition: default.phtml:15
build(ScoreBuilder $scoreBuilder, \Magento\Framework\DB\Select $select, \Magento\Framework\Search\Request\QueryInterface $query, $conditionType)