/** * Search the index * * @return void */ public function search($lang, $version, $options = []) { $options += ['query' => '', 'page' => 1, 'sort' => ['_score']]; $typeName = implode('-', [$version, $lang]); // This is a bit dangerous, but this class only has one real method. $this->name($typeName); $query = $this->query(); $q = new QueryString($options['query']); $q->setPhraseSlop(2)->setFields(['contents', 'title^3'])->setDefaultOperator('AND')->setFuzzyMinSim('0.7'); $query->page($options['page'], 25)->highlight(['pre_tags' => [''], 'post_tags' => [''], 'fields' => ['contents' => ['fragment_size' => 100, 'number_of_fragments' => 3]]])->where(function ($builder) { return $builder->matchAll(); })->query($q); $results = $query->all(); $rows = $results->map(function ($row) { $contents = ''; if ($row->highlights()) { $contents = $row->highlights()['contents']; } return ['title' => $row->title ?: '', 'url' => $row->url, 'contents' => $contents]; }); return ['page' => $options['page'] ?: 1, 'total' => $results->getTotalHits(), 'data' => $rows]; }
/** * @group unit */ public function testSetPhraseSlop() { $phraseSlop = 9; $query = new QueryString('test'); $query->setPhraseSlop($phraseSlop); $data = $query->toArray(); $this->assertEquals($phraseSlop, $data['query_string']['phrase_slop']); }
/** * @param string[] $fields * @param string $queryString * @param int $phraseSlop * @param boolean $isRescore * @return \Elastica\Query\Simple */ private function buildSearchTextQueryForFields(array $fields, $queryString, $phraseSlop, $isRescore) { $query = new \Elastica\Query\QueryString($queryString); $query->setFields($fields); $query->setAutoGeneratePhraseQueries(true); $query->setPhraseSlop($phraseSlop); $query->setDefaultOperator('AND'); $query->setAllowLeadingWildcard($this->config->get('CirrusSearchAllowLeadingWildcard')); $query->setFuzzyPrefixLength(2); $query->setRewrite('top_terms_boost_1024'); $states = $this->config->get('CirrusSearchQueryStringMaxDeterminizedStates'); if (isset($states)) { // Requires ES 1.4+ $query->setParam('max_determinized_states', $states); } return $this->wrapInSaferIfPossible($query, $isRescore); }