Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - astronom/JaverSphinxBundle: Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL · GitHub
Skip to content

Repository files navigation

JaverSphinxBundle

This bundle provides integration of Sphinx search engine with Symfony.

Features:

  • SphinxQL Query Builder
  • Integration with doctrine/orm
  • Integration with knplabs/knp-paginator-bundle
  • Symfony Profiler toolbar section with number of executed queries and profiler page with detailed information about executed queries
  • Ability to test search using Behat scenarios

Requirements

  • PHP 7.1+
  • pdo_mysql php extension

Installation

Install the bundle using composer:

composer require javer/sphinx-bundle

Configuration

Add to your app/config/config.yml the following options:

javer_sphinx:
host: 127.0.0.1port: 9306

Full configuration with default values:

javer_sphinx:
host: 127.0.0.1port: 9306config_path: "%kernel.root_dir%/config/sphinx.conf"data_dir: "%kernel.cache_dir%/sphinx"searchd_path: searchd

Usage

Synthetic example of SELECT query which returns an array:

$results = $this->container->get('sphinx')
->select('id', 'column1', 'column2', 'WEIGHT() as weight')
->from('index1', 'index2')
->where('column3', 'value1')
->where('column4', '>', 4)
->where('column5', [5, '6'])
->where('column6', 'NOT IN', [7, '8'])
->where('column7', 'BETWEEN', [9, 10])
->match('column8', 'value2')
->match(['column9', 'column10'], 'value3')
->groupBy('column11')
->groupBy('column12')
->withinGroupOrderBy('column13', 'desc')
->withinGroupOrderBy('column14')
->having('weight', '>', 2)
->orderBy('column15', 'desc')
->orderBy('column16')
->offset(5)
->limit(10)
->option('agent_query_timeout', 10000)
->option('max_matches', 1000)
->option('field_weights', '(column9=10, column10=3)')
->getResults();

Paginate a list of entities fetched from the database using Doctrine ORM QueryBuilder by searching phrase in them using Sphinx:

$queryBuilder = $this->container->get('doctrine.orm.default_entity_manager')
->createQueryBuilder()
->select('p', 'i')
->from('AppBundle:Product', 'p')
->join('AppBundle:Image', 'i')
->where('p.owner = :owner')
->setParameter('owner', $this->getUser());
$query = $this->container->get('sphinx')
->createQuery()
->select('*')
->from('product')
->match(['name', 'description'], $searchQuery)
->where('owner_id', $this->getUser()->getId())
->orderBy('created', 'desc')
->useQueryBuilder($queryBuilder, 'p');
$paginator = $this->container->get('knp_paginator')
->paginate($query, $request->query->get('page', 1), 20);

Sample shpinx.conf for the given example above:

source product
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database_name
sql_query = \
SELECT p.id, p.owner_id, p.name, p.description, UNIX_TIMESTAMP(p.created) as created, \
FROM product p \
WHERE p.deletedAt IS NULL
sql_attr_uint = owner_id
sql_attr_timestamp = created
}
index product
{
source = product
path = /usr/local/var/data/product
morphology = stem_en
min_stemming_len = 3
}

Behat tests

To be able to test search in Behat scenarios there is built-in behat context SphinxContext.

To use it you should add this context in your behat.yml, for example:

selenium:
extensions:
Behat\Symfony2Extension: ~suites:
frontend:
contexts:
- Javer\SphinxBundle\Behat\Context\SphinxContext

Please note that Symfony2Extension Behat extension is required to be able to use this feature.

Then you should add a new step to your scenario:

Given I create search index and run sphinx

This step:

  • creates a new configuration for sphinx based on your configuration
  • converts all MySQL indexes to real-time indexes
  • starts daemon
  • loads data from the database to indexes for converted MySQL -> real-time indexes
  • stops daemon at the end of the scenario

Please note that you should explicitly declare all text fields in your indexes in the following form:

source product
{
#!sql_field_string = name
}

It is not necessary when you declare fields for MySQL index in sphinx.conf, but it is needed to be able to convert indexes to real-time.

If you use sqlite as the database engine for running tests you should take into account that not all functions of the MySQL are presented in sqlite, so you should use portable analogs for these functions:

  • IF(condition, true, false) -> CASE WHEN condition THEN true ELSE false END
  • and so on

About

Symfony bundle which provides integration of Sphinx search engine with Symfony using SphinxQL

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages