TYPO3 8.7.13 - Полнотекстовый QueryBuilder для MariaDB

SELECT name 
FROM tx_snippethighlightsyntax_domain_model_snippets 
WHERE (MATCH(name, description, code, comment) AGAINST ('css'));

Этот запрос работает в phpMyAdmin с MariaDB. Теперь моя «проблема» состоит в том, чтобы адаптировать это в TYPO3 с помощью QueryBuilder. Я не вижу ни одного оператора МАТЧ или ПРОТИВ.

Пока моя функция начинается с этого:

private $tx = 'tx_snippethighlightsyntax_domain_model_snippets';

public function ftsSearch()
    {
        $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
        $ftsQueryBuilder = $connectionPool->getQueryBuilderForTable($this->tx);
        $fts = $ftsQueryBuilder
            ->select($this->tx . '.name')
            ->from($this->tx)
            ->where($ftsQueryBuilder->expr()->eq(
                MAGIC HAPPENS HERE ?
            )
            ->execute()
            ->fetchAll();
        return $fts;
    }

person Utheron    schedule 26.06.2018    source источник


Ответы (2)


Расширение Indexed Search в ядре TYPO3 использует ПОИСКПОЗ и ПРОТИВ в запросах.

Следующий код взят из IndexSearchRepository должен помочь вам составить запрос

    $searchBoolean = '';
    if ($searchData['searchBoolean']) {
        $searchBoolean = ' IN BOOLEAN MODE';
    }
    $queryBuilder->andWhere(
        'MATCH (' . $queryBuilder->quoteIdentifier($searchData['fulltextIndex']) . ')'
        . ' AGAINST (' . $queryBuilder->createNamedParameter($searchData['searchString'])
        . $searchBoolean
        . ')'
    );
person derhansen    schedule 26.06.2018
comment
Таким образом, можно объединить ПОИСКПОЗ и ПРОТИВ или что-либо еще необходимое. Это очень помогло! - person Utheron; 27.06.2018

private $tx = 'tx_snippethighlightsyntax_domain_model_snippets';

public function ftsSearch()
{
    $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
    $ftsQueryBuilder = $connectionPool->getQueryBuilderForTable($this->tx);
    $fts = $ftsQueryBuilder
        ->select($this->tx . '.name')
        ->from($this->tx)
        ->where('MATCH('
            . $this->tx .'.name,'
            . $this->tx .'.description,'
            . $this->tx .'.code,'
            . $this->tx .'.comment)'
            . ' AGAINST(' . $ftsQueryBuilder->createNamedParameter('put_search_here')
            . ')')
        ->execute()
        ->fetchAll();
    return $fts;
}

Этот работает для меня. Благодарю вас !

person Utheron    schedule 27.06.2018