Bug 142119 - Support SphinxSE (needs MySQL support)
git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1893 6955db30-a419-402b-8a0d-67ecbb4d7f56master
parent
0ac500667f
commit
532330b915
|
@ -107,6 +107,7 @@ sub connect_sphinx
|
||||||
my $host = $lc->{sphinx_host};
|
my $host = $lc->{sphinx_host};
|
||||||
my $port = $lc->{sphinx_port};
|
my $port = $lc->{sphinx_port};
|
||||||
my $sock = $lc->{sphinx_sock};
|
my $sock = $lc->{sphinx_sock};
|
||||||
|
$host = '' if $sock;
|
||||||
|
|
||||||
my $dsn = "dbi:mysql:host=$host;database=none";
|
my $dsn = "dbi:mysql:host=$host;database=none";
|
||||||
$dsn .= ";port=$port" if $port;
|
$dsn .= ";port=$port" if $port;
|
||||||
|
@ -116,6 +117,7 @@ sub connect_sphinx
|
||||||
mysql_enable_utf8 => 1,
|
mysql_enable_utf8 => 1,
|
||||||
# Needs to be explicitly specified for command-line processes.
|
# Needs to be explicitly specified for command-line processes.
|
||||||
mysql_auto_reconnect => 1,
|
mysql_auto_reconnect => 1,
|
||||||
|
raise_error => 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
$sphinx->do("SET NAMES utf8");
|
$sphinx->do("SET NAMES utf8");
|
||||||
|
|
|
@ -3287,21 +3287,40 @@ sub _populate_bugs_fulltext
|
||||||
$bug_ids = undef if $bug_ids && !@$bug_ids;
|
$bug_ids = undef if $bug_ids && !@$bug_ids;
|
||||||
my $dbh = Bugzilla->dbh;
|
my $dbh = Bugzilla->dbh;
|
||||||
# These vary between different fulltext search engines (MySQL, Sphinx)
|
# These vary between different fulltext search engines (MySQL, Sphinx)
|
||||||
my ($table, $limit1, $id_field, $quote, $sph) = ('bugs_fulltext', $dbh->sql_limit(1), 'bug_id', 'quote_fulltext', $dbh);
|
my ($table, $id_field, $quote, $sph) = ('bugs_fulltext', 'bug_id', 'quote_fulltext', $dbh);
|
||||||
|
my $nonempty;
|
||||||
if (Bugzilla->localconfig->{sphinx_index})
|
if (Bugzilla->localconfig->{sphinx_index})
|
||||||
{
|
{
|
||||||
$sph = Bugzilla->dbh_sphinx;
|
$sph = Bugzilla->dbh_sphinx;
|
||||||
$limit1 = 'LIMIT 1';
|
|
||||||
$table = Bugzilla->localconfig->{sphinx_index};
|
$table = Bugzilla->localconfig->{sphinx_index};
|
||||||
$id_field = 'id';
|
$id_field = 'id';
|
||||||
$quote = 'quote';
|
$quote = 'quote';
|
||||||
|
# Sphinx can't do fullscan for index without attributes,
|
||||||
|
# so we check if the index is empty by trying to insert a MAX_INT id
|
||||||
|
$sph->{PrintError} = 0;
|
||||||
|
$nonempty = !$sph->do("INSERT INTO $table (id) VALUES (-1)");
|
||||||
|
$sph->{PrintError} = 1;
|
||||||
|
if (my $conn = Bugzilla->localconfig->{sphinxse_port})
|
||||||
|
{
|
||||||
|
$conn = "sphinx://".Bugzilla->localconfig->{sphinx_host}.':'.Bugzilla->localconfig->{sphinxse_port}.'/'.$table;
|
||||||
|
$dbh->do("DROP TABLE IF EXISTS bugs_fulltext_sphinx");
|
||||||
|
$dbh->do("CREATE TABLE bugs_fulltext_sphinx (".
|
||||||
|
"id BIGINT NOT NULL, ".
|
||||||
|
"`weight` INT NOT NULL, ".
|
||||||
|
"`query` VARCHAR(3072) NOT NULL, ".
|
||||||
|
"INDEX(`query`)".
|
||||||
|
") ENGINE=SPHINX CONNECTION='$conn'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$nonempty = $sph->selectrow_array("SELECT $id_field FROM $table ".$dbh->sql_limit(1));
|
||||||
}
|
}
|
||||||
my $fulltext = $sph->selectrow_array("SELECT $id_field FROM $table $limit1");
|
|
||||||
my ($datasize, $time) = (0, time);
|
my ($datasize, $time) = (0, time);
|
||||||
my ($lastdata, $lasttime) = ($datasize, $time);
|
my ($lastdata, $lasttime) = ($datasize, $time);
|
||||||
# We only populate the table if it's empty or if we've been given a
|
# We only populate the table if it's empty or if we've been given a
|
||||||
# set of bug ids.
|
# set of bug ids.
|
||||||
if ($bug_ids || !$fulltext)
|
if ($bug_ids || !$nonempty)
|
||||||
{
|
{
|
||||||
# ... and if there are bugs in the bugs table.
|
# ... and if there are bugs in the bugs table.
|
||||||
$bug_ids ||= $dbh->selectcol_arrayref("SELECT bug_id FROM bugs");
|
$bug_ids ||= $dbh->selectcol_arrayref("SELECT bug_id FROM bugs");
|
||||||
|
|
|
@ -174,6 +174,14 @@ EOT
|
||||||
default => '',
|
default => '',
|
||||||
desc => "# Sphinx UNIX socket (listening MySQL protocol)\n",
|
desc => "# Sphinx UNIX socket (listening MySQL protocol)\n",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name => 'sphinxse_port',
|
||||||
|
default => 0,
|
||||||
|
desc => <<EOT
|
||||||
|
# To use MySQL Sphinx Storage Engine (bundled with MariaDB), specify
|
||||||
|
# a non-zero port on which Sphinx is listening for non-SphinxQL requests
|
||||||
|
EOT
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name => 'db_check',
|
name => 'db_check',
|
||||||
default => 1,
|
default => 1,
|
||||||
|
|
|
@ -2135,14 +2135,12 @@ sub _content_matches
|
||||||
{
|
{
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
|
my $dbh = Bugzilla->dbh;
|
||||||
|
my $table = "bugs_fulltext_".$self->{sequence};
|
||||||
my $text = $self->{value};
|
my $text = $self->{value};
|
||||||
|
|
||||||
if (my $index = Bugzilla->localconfig->{sphinx_index})
|
if (my $index = Bugzilla->localconfig->{sphinx_index})
|
||||||
{
|
{
|
||||||
# Using Sphinx
|
|
||||||
my $sph = Bugzilla->dbh_sphinx;
|
|
||||||
my $query = 'SELECT id, WEIGHT() `weight` FROM '.$index.
|
|
||||||
' WHERE MATCH(?) LIMIT 1000 OPTION field_weights=(short_desc=5, comments=1, comments_private=1)';
|
|
||||||
# Escape search query
|
# Escape search query
|
||||||
my $pattern_part = '\[\]:\(\)!@~&\/^$';
|
my $pattern_part = '\[\]:\(\)!@~&\/^$';
|
||||||
$text = trim($text);
|
$text = trim($text);
|
||||||
|
@ -2154,6 +2152,21 @@ sub _content_matches
|
||||||
}
|
}
|
||||||
$text =~ s/((?:^|[^\\])(?:\\\\)*)([$pattern_part])/$1\\$2/gs;
|
$text =~ s/((?:^|[^\\])(?:\\\\)*)([$pattern_part])/$1\\$2/gs;
|
||||||
$text = ($self->{user}->is_insider ? '@(short_desc,comments,comments_private) ' : '@(short_desc,comments) ') . $text;
|
$text = ($self->{user}->is_insider ? '@(short_desc,comments,comments_private) ' : '@(short_desc,comments) ') . $text;
|
||||||
|
if (Bugzilla->localconfig->{sphinxse_port})
|
||||||
|
{
|
||||||
|
# Using SphinxSE
|
||||||
|
$text =~ s/;/\\\\;/gso;
|
||||||
|
$self->{term} = {
|
||||||
|
table => "bugs_fulltext_sphinx $table",
|
||||||
|
where => "$table.query=".$dbh->quote("$text;mode=extended;limit=1000;fieldweights=short_desc,5,comments,1,comments_private,1"),
|
||||||
|
bugid_field => "$table.id",
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
# Using SphinxQL
|
||||||
|
my $sph = Bugzilla->dbh_sphinx;
|
||||||
|
my $query = 'SELECT `id`, WEIGHT() `weight` FROM '.$index.
|
||||||
|
' WHERE MATCH(?) LIMIT 1000 OPTION field_weights=(short_desc=5, comments=1, comments_private=1)';
|
||||||
my $ids = $sph->selectall_arrayref($query, undef, $text) || [];
|
my $ids = $sph->selectall_arrayref($query, undef, $text) || [];
|
||||||
$self->{term} = {
|
$self->{term} = {
|
||||||
term => @$ids ? 'bugs.bug_id IN ('.join(', ', map { $_->[0] } @$ids).')' : '1=0',
|
term => @$ids ? 'bugs.bug_id IN ('.join(', ', map { $_->[0] } @$ids).')' : '1=0',
|
||||||
|
@ -2167,9 +2180,6 @@ sub _content_matches
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $dbh = Bugzilla->dbh;
|
|
||||||
my $table = "bugs_fulltext_".$self->{sequence};
|
|
||||||
|
|
||||||
# Create search terms to add to the SELECT and WHERE clauses.
|
# Create search terms to add to the SELECT and WHERE clauses.
|
||||||
# These are (search term, rank term, search term, rank term, ...)
|
# These are (search term, rank term, search term, rank term, ...)
|
||||||
my @terms = (
|
my @terms = (
|
||||||
|
|
Loading…
Reference in New Issue