Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Зуев Егор
/
wiki.dev
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Authored by
Dan Brown
2017-04-09 14:44:56 +0100
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Commit
37813a223a47b63570e975604119a209deac2733
37813a22
1 parent
01cb22af
Improved DB prefix support and removed old search method
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
29 additions
and
70 deletions
app/Entity.php
database/migrations/2015_08_31_175240_add_search_indexes.php
database/migrations/2015_12_05_145049_fulltext_weighting.php
database/migrations/2017_03_19_091553_create_search_index_table.php
app/Entity.php
View file @
37813a2
...
...
@@ -176,68 +176,5 @@ class Entity extends Ownable
*/
public
function
entityRawQuery
(){
return
''
;}
/**
* Perform a full-text search on this entity.
* @param string[] $terms
* @param string[] array $wheres
* TODO - REMOVE
* @return mixed
*/
public
function
fullTextSearchQuery
(
$terms
,
$wheres
=
[])
{
$exactTerms
=
[];
$fuzzyTerms
=
[];
$search
=
static
::
newQuery
();
foreach
(
$terms
as
$key
=>
$term
)
{
$term
=
htmlentities
(
$term
,
ENT_QUOTES
);
$term
=
preg_replace
(
'/[+\-><\(\)~*\"@]+/'
,
' '
,
$term
);
if
(
preg_match
(
'/".*?"/'
,
$term
)
||
is_numeric
(
$term
))
{
$term
=
str_replace
(
'"'
,
''
,
$term
);
$exactTerms
[]
=
'%'
.
$term
.
'%'
;
}
else
{
$term
=
''
.
$term
.
'*'
;
if
(
$term
!==
'*'
)
$fuzzyTerms
[]
=
$term
;
}
}
$isFuzzy
=
count
(
$exactTerms
)
===
0
&&
count
(
$fuzzyTerms
)
>
0
;
$fieldsToSearch
=
[
'name'
,
$this
->
textField
];
// Perform fulltext search if relevant terms exist.
if
(
$isFuzzy
)
{
$termString
=
implode
(
' '
,
$fuzzyTerms
);
$search
=
$search
->
selectRaw
(
'*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance'
,
[
$termString
]);
$search
=
$search
->
whereRaw
(
'MATCH('
.
implode
(
','
,
$fieldsToSearch
)
.
') AGAINST(? IN BOOLEAN MODE)'
,
[
$termString
]);
}
// Ensure at least one exact term matches if in search
if
(
count
(
$exactTerms
)
>
0
)
{
$search
=
$search
->
where
(
function
(
$query
)
use
(
$exactTerms
,
$fieldsToSearch
)
{
foreach
(
$exactTerms
as
$exactTerm
)
{
foreach
(
$fieldsToSearch
as
$field
)
{
$query
->
orWhere
(
$field
,
'like'
,
$exactTerm
);
}
}
});
}
$orderBy
=
$isFuzzy
?
'title_relevance'
:
'updated_at'
;
// Add additional where terms
foreach
(
$wheres
as
$whereTerm
)
{
$search
->
where
(
$whereTerm
[
0
],
$whereTerm
[
1
],
$whereTerm
[
2
]);
}
// Load in relations
if
(
$this
->
isA
(
'page'
))
{
$search
=
$search
->
with
(
'book'
,
'chapter'
,
'createdBy'
,
'updatedBy'
);
}
else
if
(
$this
->
isA
(
'chapter'
))
{
$search
=
$search
->
with
(
'book'
);
}
return
$search
->
orderBy
(
$orderBy
,
'desc'
);
}
}
...
...
database/migrations/2015_08_31_175240_add_search_indexes.php
View file @
37813a2
...
...
@@ -12,9 +12,10 @@ class AddSearchIndexes extends Migration
*/
public
function
up
()
{
DB
::
statement
(
'ALTER TABLE pages ADD FULLTEXT search(name, text)'
);
DB
::
statement
(
'ALTER TABLE books ADD FULLTEXT search(name, description)'
);
DB
::
statement
(
'ALTER TABLE chapters ADD FULLTEXT search(name, description)'
);
$prefix
=
DB
::
getTablePrefix
();
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
pages ADD FULLTEXT search(name, text)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
books ADD FULLTEXT search(name, description)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
chapters ADD FULLTEXT search(name, description)"
);
}
/**
...
...
database/migrations/2015_12_05_145049_fulltext_weighting.php
View file @
37813a2
...
...
@@ -12,9 +12,10 @@ class FulltextWeighting extends Migration
*/
public
function
up
()
{
DB
::
statement
(
'ALTER TABLE pages ADD FULLTEXT name_search(name)'
);
DB
::
statement
(
'ALTER TABLE books ADD FULLTEXT name_search(name)'
);
DB
::
statement
(
'ALTER TABLE chapters ADD FULLTEXT name_search(name)'
);
$prefix
=
DB
::
getTablePrefix
();
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
pages ADD FULLTEXT name_search(name)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
books ADD FULLTEXT name_search(name)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
chapters ADD FULLTEXT name_search(name)"
);
}
/**
...
...
database/migrations/2017_03_19_091553_create_search_index_table.php
View file @
37813a2
...
...
@@ -26,7 +26,19 @@ class CreateSearchIndexTable extends Migration
$table
->
index
(
'score'
);
});
// TODO - Drop old fulltext indexes
// Drop search indexes
Schema
::
table
(
'pages'
,
function
(
Blueprint
$table
)
{
$table
->
dropIndex
(
'search'
);
$table
->
dropIndex
(
'name_search'
);
});
Schema
::
table
(
'books'
,
function
(
Blueprint
$table
)
{
$table
->
dropIndex
(
'search'
);
$table
->
dropIndex
(
'name_search'
);
});
Schema
::
table
(
'chapters'
,
function
(
Blueprint
$table
)
{
$table
->
dropIndex
(
'search'
);
$table
->
dropIndex
(
'name_search'
);
});
app
(
\BookStack\Services\SearchService
::
class
)
->
indexAllEntities
();
}
...
...
@@ -38,6 +50,14 @@ class CreateSearchIndexTable extends Migration
*/
public
function
down
()
{
$prefix
=
DB
::
getTablePrefix
();
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
pages ADD FULLTEXT search(name, text)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
books ADD FULLTEXT search(name, description)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
chapters ADD FULLTEXT search(name, description)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
pages ADD FULLTEXT name_search(name)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
books ADD FULLTEXT name_search(name)"
);
DB
::
statement
(
"ALTER TABLE
{
$prefix
}
chapters ADD FULLTEXT name_search(name)"
);
Schema
::
dropIfExists
(
'search_terms'
);
}
}
...
...
Please
register
or
sign in
to post a comment