검색 색인을 만드는 것이 좋습니다. 다음에
내가 당신
persons
표는 다음과 같습니다 가정
| person_id | firstname | lastname | ssn |
가 검색 색인을 구축 할 수 있도록, 당신은에 대한 person_searchindex
표가 필요합니다
| person_id | search_term |
당신 다음과 같은 것을 사용할 수 있습니다. (단지 첫 번째 스케치 일뿐입니다.)
<?php
function addTermToSearchIndex($person_id, $term)
{
performQuery("INSERT INTO person_searchindex (person_id, search_term)
VALUES (" . (int)$person_id . ", ".
"\"" . escapeForQuery($term) . "\");");
}
function buildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn)
{
$firstnames = explode(" ", $firstname);
foreach($firstnames => $name)
{
addTermToSearchIndex($person_id, $name);
}
$lastnames = explode(" ", $lastname);
foreach($lastnames => $name)
{
addTermToSearchIndex($person_id, $name);
}
addTermToSearchIndex("$ssn");
}
function deleteSearchIndexForPerson($person_id)
{
performQuery("DELETE FROM person_searchindex WHERE person_id = " . (int)$person_id . ";");
}
function rebuildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn)
{
deleteSearchIndexForPerson($person_id);
buildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn);
}
function rebuildSearchIndex()
{
performQuery("DELETE FROM person_searchindex;");
$result = performQuery("SELECT * FROM persons;");
while($row = getRow($result))
{
buildSearchIndexForPerson($ow["person_id"], $row["firstname"], $row["lastname"], $row["ssn"]);
}
}
function search($searchterm)
{
$sqlcond = "FALSE";
$terms = explode(" ", $searchterm);
foreach($terms => $term)
{
$sqlcond .= " OR s.search_term LIKE \"%" . escapeForQuery($term) . "%\"";
}
return performQuery("SELECT p.person_id, p.firstname, p.lastname, p.ssn FROM persons AS p LEFT JOIN person_searchindex AS s ON p.person_id = s.person_id WHERE $sqlcond;");
}
?>
사람 행을 추가하거나 변경할 때마다 rebuildSearchIndexForPerson()
메 소드에 호출을 추가하십시오. 사람 행을 삭제할 때마다 방법 deleteSearchIndexForPerson()
에 대한 호출을 추가하십시오. 처음으로 무언가를 검색하려면 먼저 rebuildSearchIndex()
으로 전화하여 이전 사람 행에 대한 검색 색인을 만들어야합니다. 그 후에 search()
기능을 사용할 수 있습니다.
내가 말했듯이, 그것은 아주 첫 번째 스케치 일뿐입니다. 예를 들어 performQuery
, escapeForQuery
및 getRow
메소드를 실제로 사용하려는 것으로 변경해야합니다. 또한, PHP 코드의 품질은 특별히 좋지 않습니다. 그러나 그것이 어떻게 작동하는지에 대한 그림이 분명 해져야합니다. 데이터 모델을 재 작업하지 않는 한 어떤 시점에서 당신이 당신의 전체 데이터 세트에 문자열 작업을해야하기 때문에
, 당신은 매우 느린 검색을 끝낼 것입니다. –
왜 그럴까요? 또한 explode를 사용하여 LIKE 쿼리를 변경하는 경우 –
firstname 열에 "John Joe Jack James Joaquin"이 포함되었을 수 있습니다. 중도만을 검색하려면 "John"을 잘라야합니다. 모든 행에. 분명히 당신은''%% James % ''와 같은 행을 할 수 있습니다. 그리고 그 열의 첫 번째 이름이 아닌 행을 확인하십시오. 그러나 그것은 느려질 것입니다. –