사용자를 사이트에 머물게 하는 가장 좋은 방법은 사용자가 원하는 것을 찾을 수 있도록 하는 것입니다. 이를 위해 편리한 시스템을 만들면 사이트에 대한 선호도가 높아지고 사용자는 자신이 관심을 갖는 것을 찾기 위해 확실히 돌아올 것입니다.

사이트에서 기사를 검색하는 데 사용할 간단하지만 기능적으로 효과적인 검색 양식을 만드는 방법을 보여 드리겠습니다. 결과는 다시 로드하지 않고도 페이지에 표시됩니다. 이는 의심의 여지가 없습니다. 가장 좋은 방법정보 제공.

HTML과 JavaScript를 포함하는 search.php라는 2개의 파일을 생성하겠습니다. 두 번째 파일인 do_search.php에는 PHP 코드가 포함됩니다. 첫 번째 파일 생성을 시작해 보겠습니다.

PHP, jQuery 검색 데모 $(function() ( $(".search_button").click(function() ( // 사용자가 작성한 내용 가져오기 var searchString = $("#search_box").val(); // 양식 쿼리 문자열 var data = "search="+ searchString; // searchString이 비어 있지 않은 경우 if(searchString) ( // Ajax 요청 만들기 $.ajax(( type: "POST", url: "do_search.php", data: data, beforeSend: function(html) ( // 요청이 호출되기 전에 실행됩니다. $("#results").html(""); $("#searchresults").show(); $(". word").html (searchString); ), Success: function(html)( // 결과를 받은 후 실행됩니다 $("#results").show(); $("#results").append(html) ; ) ) 거짓을 반환 ));
ajax라는 단어를 입력해 보세요.

다음에 대한 결과 이 파일에서 우리는 정규 파일을 만들었습니다. HTML 양식

, 백엔드 파일 do_search.php에 POST 요청을 보냅니다.

PHP 코드에는 주석이 포함되어 있어 스크립트 작동 방식을 쉽게 이해할 수 있습니다. 데이터베이스에 일치하는 항목이 있으면 사용자에게 표시하고 사용자가 검색한 단어를 굵게 강조 표시합니다.

Body( 글꼴 계열:Arial, Helvetica, sans-serif; ) *( 여백:0;패딩:0; ) #container ( 여백: 0 자동; 너비: 600px; ) a ( 색상:#DF3D82; 텍스트 장식: 없음 ) a:hover ( 색상:#DF3D82; 텍스트 장식:밑줄; ) ul.update ( 목록 스타일:none;font-size:1.1em; margin-top:10px ) ul.update li( 높이:30px; border-bottom:#dedede solid 1px; text-align:left;) ul.update li:first-child( border-top:#dedede solid 1px; height:30px; text-align:left; ) #flash ( 여백- 상단:20px; 텍스트 정렬:왼쪽; ) #검색결과( 텍스트 정렬:왼쪽; 여백-상단:20px; 디스플레이:없음; 글꼴 계열:Arial, Helvetica, sans-serif; 글꼴 크기:16px; 색상: #000; ) .word ( 글꼴 무게: 굵게; 색상:#000000; ) #search_box ( 패딩: 4px; 테두리: 단색 1px #666666; 너비: 300px; 높이: 30px; 글꼴 크기: 18px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .search_button( 테두리:#000000 단색 1px; 패딩: 6px; 색상:#000; 글꼴 무게:bold; 글꼴 크기:16px;-moz- 테두리 반경: 6px;-webkit-테두리 반경: 6px).found(글꼴 무게: 굵게; 글꼴 스타일: 기울임체; 색상: #ff0000; ) h2 (오른쪽 여백: 70px; )

이제 페이지를 다시 로드하지 않고도 작동하는 간단한 검색 양식을 만드는 방법을 배웠습니다. 수업이 즐거웠기를 바랍니다.

SSY는 "Siddha Samadhi Yoga"(종종 '침묵의 과학 요가'로 확장됨)의 약자로 Siddha는 '증명되거나 성취된 어떤 것(즉, 지식)'을 의미하고 Samadhi는 '지성이 평정한 상태'를 의미하며 요가는 '자신의 상위 자아와의 결합'을 의미합니다.

SSY는 삶의 기본 지식입니다. 우리의 고대 리시들은 브라흐모파데삼(Brahmopadesam)이라는 독특한 훈련 방식을 공식화했는데, 이는 무위(無爲), 내부의 고요함과 외부의 풍요로움을 경험하는 과학에 대한 지침입니다. 그것은 인생관에 큰 변화를 가져오고 개인의 놀라운 성숙을 가져옵니다. SSY는 브라흐모파데삼(Brahmopadesam)이라는 고대 과학의 현대판에 지나지 않습니다.

SSY는 Life Yessence Academy(LiYA)에서 제공하는 교육 프로그램으로 이 기관의 대표 프로그램입니다. 주력 프로그램이기 때문에 조직의 이름과 동의어가 되었습니다. 이 위대한 지식에 대한 훈련은 LiYA의 교사들에 의해 세계 여러 곳에서 진행됩니다. LiYA의 인도 지부는 RSVK(Rishi Samskruti Vidya Kendra)라고 합니다.

“나는 몸이다” 첫 번째각성을 죽이는 개념. SSY는 과정이다
완전한 초연의 상태인 삼매(Samadhi)에 들어가는 것입니다. "
- 구루지

저자의 말: 안녕하세요, 친구들. 이 기사에서는 사이트에 대한 실시간 검색을 계속해서 구현하겠습니다. 실시간 검색이란 무엇입니까? Google이나 Yandex에서 무언가를 검색할 때 항상 이 단어를 보게 됩니다. 검색어를 입력하기 시작하자마자 검색 엔진은 즉시 옵션을 제공하기 시작하며, 이 중에서 가장 적합한 옵션만 선택할 수 있습니다. 편리하지 않나요? 비슷한 것을 구현해 봅시다.

현재 기사의 소스 파일은 에서 다운로드할 수 있습니다. 기사의 첫 번째 부분은 다음에서 찾을 수 있습니다.

그래서 첫 번째 부분에서는 실시간 검색에 사용할 데이터베이스를 준비하고 자동완성 위젯도 첨부했습니다. jQuery 라이브러리우리 페이지의 검색 필드에 대한 UI입니다. 지금은 위젯이 테스트 데이터와 함께 작동하지만 이제 이를 수정하겠습니다.

우선 위젯에 대한 또 다른 데이터 소스를 지정해 보겠습니다. 예를 들어 이 파일도 생성해야 하는 search.php 파일입니다.

$(function())( $("#search").autocomplete(( 소스: "search.php", )); ));

이제 검색 필드에 문자를 입력하고 브라우저 콘솔에 어떤 일이 발생하는지 살펴보겠습니다.

보시다시피 GET 요청은 검색 필드에 입력된 문자열 값인 용어 매개변수와 함께 전송됩니다. 이 경우 페이지를 다시 로드하지 않고 모든 것이 비동기적으로 발생합니다. AJAX가 사용됩니다.

좋습니다. 이제 들어오는 검색 요청을 수락하고 이에 대한 답변을 제공하는 일만 남았습니다. 이렇게 하려면 데이터베이스 서버에 대한 연결을 설정하고 요청 시 데이터베이스에서 데이터를 수신하는 간단한 코드를 작성해야 합니다. search.php 파일의 코드는 다음과 같습니다:

$db = mysqli_connect("localhost", "root", "", "world") or die("데이터베이스에 연결되지 않음"); mysqli_set_charset($db, "utf8") 또는 die("연결 인코딩이 설정되지 않았습니다."); /** * 자동 완성 검색 **/ function search_autocomplete())( global $db; $search = Trim(mysqli_real_escape_string($db, $_GET["term"])); $query = "SELECT Name FROM city WHERE Name LIKE " %($search)%" 제한 10"; $res = mysqli_query($db, $query); $result_search = array(); while($row = mysqli_fetch_assoc($res))( $result_search = array("label " => $row["이름"]); $result_search 반환; ) if(!empty($_GET["term"]))( $search = search_autocomplete(); exit(json_encode($search)); )

$ db = mysqli_connect ("localhost" , "root" , "" , "world" ) 또는 die ("데이터베이스에 연결되지 않음" ) ;

mysqli_set_charset($db, "utf8") 또는 die("연결 인코딩이 설정되지 않았습니다.");

* 자동 완성 검색

함수 search_autocomplete() (

글로벌$db;

$search = 트림(mysqli_real_escape_string($db, $_GET["term"]));

$res = mysqli_query($db, $query);

$결과_검색=배열();

while ($row = mysqli_fetch_assoc($res)) (

$result_search = array("라벨" => $row["이름"]) ;

$result_search를 반환합니다.

if (!empty ($ _GET [ "term" ] ) ) (

$search = 검색_자동완성();

종료(json_encode($search));

요청 시 데이터를 수신하는 search_autocomplete 함수는 이 데이터를 특정 형식으로 반환해야 하며, 발견된 도시의 레이블 키와 값이 포함된 배열이어야 합니다. 함수를 호출한 후 데이터를 JSON 형식으로 변환해야 합니다.

실시간 검색의 작동을 확인하는 것이 남아 있습니다. 이를 위해 지난번과 마찬가지로 a라는 문자 하나만 입력해 보겠습니다.

엄청난! 이에 대한 응답으로 우리는 입력된 문자가 이름에 포함된 도시 12개를 받았습니다. 계속해서 이름을 입력하면 옵션 목록이 변경됩니다. 각 편지와 함께 전송됩니다 새로운 요청 AJAX.

주형

사이트 검색 결과가 표시되어야 하는 템플릿의 이름입니다. XSLT 템플릿 엔진에서는 무시됩니다.

검색_문자열

검색 문구. 값을 지정하지 않으면 검색 양식을 통해 전송된 요청에서 가져옵니다.

검색 유형

검색을 위한 계층적 유형 식별자 목록(공백으로 구분하여 지정) 값을 지정하지 않으면 모든 유형에 대해 검색이 수행됩니다.

Search_branches

검색을 수행할 섹션 목록(공백으로 표시) 값을 지정하지 않으면 모든 섹션에서 검색이 수행됩니다. 매개변수는 페이지 ID와 해당 URL을 모두 허용할 수 있습니다.

페이지당

페이지당 결과 수입니다. 매개변수가 지정되지 않은 경우 "검색" 모듈 설정에 지정된 값이 사용됩니다.

%총%

피드의 총 뉴스 항목 수를 표시합니다. %system numpages()% 매크로에 사용할 수 있습니다.

%per_page%

per_page 매개변수의 값을 표시합니다. %system numpages()% 매크로에 사용할 수 있습니다.

%목록-클래스-첫 번째%

요소가 첫 번째인 경우 "first"를 출력합니다.

%목록-클래스-마지막%

요소가 마지막이면 "last"를 출력합니다.

%목록-클래스-홀수%

요소가 짝수이면 "홀수"를 인쇄합니다.

%목록-클래스-짝수%

요소가 홀수이면 "짝수"를 인쇄합니다.

%목록-위치%

목록에 일련번호를 삽입합니다.

검색_빈_결과

검색 결과 페이지가 없는 경우에 사용됩니다. 이 경우 search_block 블록 대신 이 블록이 출력됩니다.

%last_search_string%

이전 검색어가 있는 경우 해당 검색어를 표시합니다.

검색_블록_라인_퀀트

검색 결과 사이에 삽입되는 구분자를 출력합니다.

사용 예

이브라힘 디알로

2014년 7월 2일 발행 ~ 16분 분량

검색은 웹사이트에서 중요한 기능입니다. 소수의 독자들이 내 블로그에서 특정 구절을 찾고 싶을 때 검색 상자를 사용합니다. 예전에는 Google 검색을 통해 구동되었지만 그 이후로 더 잘할 수 있어서가 아니라 흥미로운 도전이었기 때문에 내 집에서 만든 버전으로 변경했습니다.

바쁘고 사이트를 검색 가능하게 만들고 싶다면 이전에 했던 것처럼 Google을 사용하세요.

// search.php 파일에서 $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("위치: $redirect"); 출구;

그것이 하는 일은 매우 간단합니다. 사용자가 전달한 용어를 가져와 Google 검색 페이지에 전달합니다. 검색어에 site: 키워드를 사용하여 검색 결과를 현재 도메인으로 제한합니다. 이제 Google에서 색인을 생성한 모든 페이지를 검색을 통해 사용할 수 있습니다. 그러나 집에서 검색을 처리하고 싶다면 계속 읽으십시오.

홈메이드 검색 솔루션

더 진행하기 전에 이 블로그의 검색창을 사용해 보세요. 아래에서 설명할 것과 동일한 프로세스를 사용합니다. 이것이 당신이 원하는 것이라고 생각한다면 계속 읽으십시오.

이 솔루션은 소규모 웹사이트에 적합합니다. LIKE를 양쪽 끝에 와일드카드와 함께 사용합니다. 이는 검색이 색인화될 수 없음을 의미합니다. 즉, 이 솔루션은 많은 양의 데이터가 포함되지 않은 블로그나 개인 웹사이트에서 제대로 작동하며 더 큰 웹사이트로 이식하면 매우 느려질 수 있습니다.

참고: 블로그 게시물이 5000개라도 괜찮습니다. .

이 블로그의 구조를 참고로 삼겠습니다. 각 블로그 게시물에는 다음이 포함됩니다.

  • 제목 p_title
  • URL p_url
  • 요약 p_summary
  • 게시물 내용 p_content
  • 카테고리 Category.tagname

검색어와 일치하는 모든 필드에 대해 점수를 부여합니다. 점수는 경기의 중요성에 따라 결정됩니다.

// 정확한 용어 일치는 제목에서 발견됩니다. $scoreFullTitle = 6; // 부분의 제목과 일치합니다. $scoreTitleKeyword = 5; // 정확한 용어 일치가 요약에서 발견되었습니다. $scoreFullSummary = 5; // 부분의 요약과 일치합니다. $scoreSummaryKeyword = 4; // 정확한 용어 일치 항목이 콘텐츠에서 발견되었습니다. $scoreFullDocument = 4; // 부분의 문서와 일치합니다. $scoreDocumentKeyword = 3; // 카테고리와 일치합니다. $scoreCategoryKeyword = 2; // URL과 일치합니다. $scoreUrlKeyword = 1;

시작하기 전에 검색에 크게 기여하지 않는 몇 가지 단어를 제거해야 합니다. 예: "in","it","a","the","of" ... . 우리는 이러한 단어를 걸러내고 관련이 없다고 생각되는 단어를 자유롭게 추가할 것입니다. 또 다른 점은 쿼리 길이를 제한하고 싶다는 것입니다. 우리는 사용자가 검색 필드에 소설을 써서 MySQL 서버가 충돌하는 것을 원하지 않습니다.

// 검색어에서 불필요한 단어를 제거하고 배열 함수로 반환 filterSearchKeys($query)( $query = Trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // 단어로 이 목록을 확장합니다. $list = array("in","it","a","the","of","or","I","you", "그", "나", "우리", "그들", "그녀", "에게", "하지만", "저것", "이것", "저것들", "그때") foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words ; ) // 단어 수 제한 functionlimitChars($query, $limit = 200)( return substr($query, 0,$limit); )

이제 도우미 기능으로 문자 수를 제한하고 불필요한 단어를 필터링할 수 있습니다. 우리가 알고리즘을 구현하는 방법은 일치하는 항목을 찾을 때마다 점수를 제공하는 것입니다. if 문을 사용하여 단어를 일치시키고 더 많은 단어를 일치시키면 포인트가 누적됩니다. 마지막에는 해당 점수를 사용하여 결과를 정렬할 수 있습니다.

참고: MySQL 데이터베이스에 연결하는 방법은 보여주지 않겠습니다. 데이터베이스에 효율적으로 연결하는 데 문제가 있는 경우 이 내용을 읽어 보시기 바랍니다.

먼저 함수에 구조를 지정해 보겠습니다. 참고 섹션을 별도로 구현할 수 있도록 자리 표시자를 남겨 두었습니다.

함수 search($query)( $query = Trim($query); if (mb_strlen($query)===0)( // 빈 검색이 필요 없겠죠? return false; ) $query =limitChars($query) ; // 점수 측정 $scoreFullKeyword = 4; $scoreDocumentKeyword = 2; $escQuery = DB::escape($query); = array(); $docSQL = array(); (); $urlSQL = array(); /** 일치하는 키워드 PLACE HOLDER **/ $sql = "SELECT p. p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- 제목 점수 ".implode(" + ", $titleSQL).")+ (-- 요약 ".implode(" + ", $sumSQL) .")+ (-- 문서 ".implode(" + ", $docSQL).")+ (-- 태그/범주 ".implode(" + ", $ CategorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) 관련성 FROM 게시물 p WHERE p.status = "published" HAVING 관련성 >

쿼리에서 모든 점수는 관련성 변수로 합산되며 이를 사용하여 결과를 정렬할 수 있습니다.

전체 발생 일치

먼저 몇 가지 키워드가 있는지 확인한 다음 쿼리를 추가합니다.

If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )

점수가 더 높은 경기입니다. 검색어가 이러한 내용을 포함하는 기사와 일치하면 해당 기사가 상단에 나타날 가능성이 더 높아집니다.

일치하는 키워드 발생

모든 키워드를 반복하여 필드와 일치하는지 확인합니다. 카테고리 일치의 경우 게시물에 여러 카테고리가 있을 수 있으므로 하위 쿼리를 사용했습니다.

Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; ((SELECT count(category.tag_id) FROM 카테고리 JOIN post_category ON post_category.tag_id = Category.tag_id WHERE post_category.post_id = p.post_id AND Category.name = "".DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; )

또한 아래 주석 작성자가 지적한 것처럼 이러한 변수가 빈 배열이 아닌지 확인해야 합니다. 그렇지 않으면 쿼리가 실패합니다.

// "비어 있으면 0을 추가합니다. if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (비어 있음($urlSQL))( $urlSQL = 0; ) if (비어 있음($tagSQL))( $tagSQL = 0; )

마지막에는 검색어에 대한 게시물의 관련성을 결정하기 위해 쿼리가 모두 연결되고 추가됩니다.

// 검색어에서 불필요한 단어를 제거하고 배열 함수로 반환 filterSearchKeys($query)( $query = Trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // 단어로 이 목록을 확장합니다. $list = array("in","it","a","the","of","or","I","you", "그", "나", "우리", "그들", "그녀", "에게", "하지만", "저것", "이것", "저것들", "그때") foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words ; ) // 단어 수 제한 functionlimitChars($query, $limit = 200)( return substr($query, 0,$limit); ) function search($query)( $query = Trim ($query); if (mb_strlen($query)===0)( // 빈 검색이 필요하지 않나요? return false; ) $query =limitChars($query); // 점수 가중치 $scoreFullTitle = 6 $; 점수전체키워드 = 4; ")+ (-- 요약 ".implode(" + ", $sumSQL).")+ (-- 문서 ".implode(" + ", $docSQL).")+ (-- 태그/범주 ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) 관련성 FROM 게시물 p WHERE p.status = "published" HAVING 관련성 > 0 ORDER BY 관련성 DESC,p.page_views DESC LIMIT 25";

이제 search.php 파일은 다음과 같습니다:

$term = isset($_GET["query"])?$_GET["query"]: ""; $search_results = 검색($term); if (!$search_results) ( echo "No results"; exit; ) // 여기에 결과가 포함된 페이지를 인쇄합니다.

우리는 상당한 양의 콘텐츠를 처리할 수 있는 간단한 검색 알고리즘을 만들었습니다. 나는 각 경기의 점수를 임의로 선택했으며, 자신에게 가장 적합한 점수로 자유롭게 조정할 수 있습니다. 그리고 항상 개선의 여지가 있습니다.

사용자가 입력한 검색어를 추적하는 것이 좋습니다. 이렇게 하면 대부분의 사용자가 동일한 항목을 검색하는지 확인할 수 있습니다. 패턴이 있으면 여행을 저장하고 Memcached를 사용하여 결과를 캐시할 수 있습니다.

이 검색 알고리즘이 실제로 작동하는 모습을 보려면 페이지 상단의 검색 상자에서 기사를 찾아보세요. 텍스트에서 일치하는 부분을 반환하는 등의 추가 기능을 추가했습니다. 당신의 기능에 자유롭게 기능을 추가해보세요.

이 기사가 마음에 드셨나요? 당신은 할 수 있습니다더 멋진 내용을 읽으려면 구독하세요.

.

관련하여 흥미로운 기사를 소개합니다.

웹 서버가 매일 하는 일 중 하나가 데이터베이스에 연결하는 것입니다. 나는 수년 동안 PHP를 사용해 왔지만 데이터베이스에서 데이터를 가져오는 스크립트를 작성하라고 요청하면 먼저 Ultimate PHP 매뉴얼로 돌아가서 몇 가지 예를 찾지 않고서는 그것을 할 수 없었습니다.

몇 달 전에 PHP 버전을 업데이트했습니다. PHP 5.4에서 5.5. 이전에는 PHP를 업데이트하는 데 아무런 문제가 없었습니다. 나는 그 개발을 면밀히 관찰하고 더 이상 사용되지 않는 기능이 공식적으로 제거되기 훨씬 전에 제거하려고 노력합니다. 그러나 이번에 나는 방심했다. 가장 슬픈 이유로 내 웹사이트의 일부가 조용히 중단되었습니다.

댓글(45)

자릴 2015년 8월 12일:

이안 무스타파 2015년 9월 26일:

롭 2015년 9월 29일:

2016년 2월 11일 기준: