SiteSearch 기능 추가를 위해 Silverstripe에서 FullTextSearchable을 활성화하면 기본적으로 페이지 테이블을 MyISAM으로 변환하지만 InnoDB 테이블 만 유지해야합니다. MySQL 버전> 5.6을 사용 중입니다. (전체 텍스트를 지원합니다)Silverstripe FulltextSearchable은 테이블 엔진을 MyIsam으로 변환합니다
0
A
답변
0
전체 텍스트 검색은 MyISAM에서만 가능합니다. 이것은 MyISAM이 InnoDB에 가지고있는 주요 이점 중 하나입니다. 관련 : https://dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam
5
InnoDB는 MySQL 버전 5.6 이후로 Fulltext 검색을 지원하지만, 프레임 워크와 함께 제공되는 MySQLSchemaManager
은 fulltext 인덱스가 정의 된 테이블에서 InnoDB를 사용하지 못하도록합니다. 아마도 GitHub에서 문제를 제기 할 수 있습니다.
# Compare this to https://github.com/silverstripe/silverstripe-framework/blob/3.5/model/connect/MySQLSchemaManager.php#L100
class MyCustomSchemaManager extends MySQLSchemaManager
{
public function alterTable($tableName, $newFields = null, $newIndexes = null, $alteredFields = null,
$alteredIndexes = null, $alteredOptions = null, $advancedOptions = null
) {
if ($this->isView($tableName)) {
$this->alterationMessage(
sprintf("Table %s not changed as it is a view", $tableName),
"changed"
);
return;
}
$alterList = array();
if ($newFields) {
foreach ($newFields as $k => $v) {
$alterList[] .= "ADD \"$k\" $v";
}
}
if ($newIndexes) {
foreach ($newIndexes as $k => $v) {
$alterList[] .= "ADD " . $this->getIndexSqlDefinition($k, $v);
}
}
if ($alteredFields) {
foreach ($alteredFields as $k => $v) {
$alterList[] .= "CHANGE \"$k\" \"$k\" $v";
}
}
if ($alteredIndexes) {
foreach ($alteredIndexes as $k => $v) {
$alterList[] .= "DROP INDEX \"$k\"";
$alterList[] .= "ADD " . $this->getIndexSqlDefinition($k, $v);
}
}
$dbID = self::ID;
if ($alteredOptions && isset($alteredOptions[$dbID])) {
$this->query(sprintf("ALTER TABLE \"%s\" %s", $tableName, $alteredOptions[$dbID]));
$this->alterationMessage(
sprintf("Table %s options changed: %s", $tableName, $alteredOptions[$dbID]),
"changed"
);
}
$alterations = implode(",\n", $alterList);
$this->query("ALTER TABLE \"$tableName\" $alterations");
}
}
는 그런 다음 사용자 정의 클래스 사용 Injector
를 사용할 수 있습니다 : 당신은 (MySQLSchemaManager
및 재정의 alterTable()
을 확장하여)이 제한없이 자신의 SchemaManager를 만들 수 있습니다
# Config.yml
Injector:
MySQLSchemaManager:
class: MyCustomSchemaManager
을 이제 사용할 수 있어야합니다 정적 인 create_table_options
은 InnoDB 엔진을 강제하고, indexes
정적을 통해 전체 텍스트 인덱스를 생성합니다.
예 :
# SomePage.php
/**
* Force InnoDB database engine.
*
* @var array
*/
private static $create_table_options = [
'MySQLDatabase' => 'ENGINE=InnoDB'
];
/**
* Define what fulltext indexes to create.
*
* @var array
*/
private static $indexes = [
'SearchFields' => [
'type' => 'fulltext',
'name' => 'SearchFields',
'value' => '"MyField", "Tags"',
]
];
예, InnoDB하지만 MySQL의 v5.6에까지이를 지원하지 않았다. 그러나, 5.6 이상 mysql 버전. 전체 텍스트 검색을 지원합니다. – Vishal
모든 테이블을 InnoDB에 저장해야하는 이유는 AWS의 자동 백업에 문제가 발생할 수 있기 때문입니다. http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html#Overview.BackupDeviceRestrictions – Vishal