복붙노트

[SQL] 어떻게 MySQL의에서 키워드 검색을 구현하는 방법?

SQL

어떻게 MySQL의에서 키워드 검색을 구현하는 방법?

나는 SQL 프로그래밍에 새로운 오전.

나는 필드 ID, 위치, 종류, 위치, 급여 범위, 설명, refno입니다 테이블 작업을해야합니다.

나는 프론트 엔드에서 키워드 검색을 구현하려는. 키워드는 위 테이블의 필드 중 하나에 상주 할 수 있습니다.

이것은 내가 시도 질의이지만 많은 중복 행으로 구성

SELECT
    a.*,
    b.catname
FROM
    job a,
    category b
WHERE
    a.catid = b.catid AND
    a.jobsalrange = '15001-20000' AND
    a.jobloc = 'Berkshire' AND
    a.jobpos LIKE '%sales%' OR
    a.jobloc LIKE '%sales%' OR
    a.jobsal LIKE '%sales%' OR
    a.jobref LIKE '%sales%' OR
    a.jobemail LIKE '%sales%' OR
    a.jobsalrange LIKE '%sales%' OR
    b.catname LIKE '%sales%'

해결법

  1. ==============================

    1.VARCHAR에 하나의 키워드가 필드를 들어 당신은 LIKE를 사용할 수 있습니다 :

    VARCHAR에 하나의 키워드가 필드를 들어 당신은 LIKE를 사용할 수 있습니다 :

    SELECT id, category, location
    FROM table
    WHERE
    (
        category LIKE '%keyword%'
        OR location LIKE '%keyword%'
    )
    

    설명은 보통 더 나은 전체 텍스트 인덱스를 추가하고 (만의 MyISAM)을 전체 텍스트 검색을 수행하고 있습니다 :

    SELECT id, description
    FROM table
    WHERE MATCH (description) AGAINST('keyword1 keyword2')
    
  2. ==============================

    2.

    SELECT 
        *
    FROM 
        yourtable
    WHERE 
        id LIKE '%keyword%' 
        OR position LIKE '%keyword%'
        OR category LIKE '%keyword%'
        OR location LIKE '%keyword%'
        OR description LIKE '%keyword%'
        OR refno LIKE '%keyword%';
    
  3. ==============================

    3.이상적으로, 필드를 포함하는 키워드 테이블이 있습니다 :

    이상적으로, 필드를 포함하는 키워드 테이블이 있습니다 :

    Keyword
    Id
    Count (possibly)
    

    키워드에 인덱스. 다른 테이블 있도록 행이 변경 될 때마다 키워드를 추출하고, 투입 (또는 교체)이 테이블에 삽입 / 업데이트 / 삭제 트리거를 만듭니다.

    또한 키워드로 계산 (해당되는 경우, 그리고, 그래서,하지만 ...)하지 않는 단어의 테이블이 필요합니다.

    이 방법 예 : "Java 및 RCA1802 포함"같은 더 복잡한 쿼리를, 당신은 키워드를 찾기 위해 원하는 쿼리에 대해 최적의 속도를 얻을 수 있습니다 당신은 (비교적 쉽게) 구현할 수 있습니다.

    "LIKE"쿼리는 작동하지만 그들은뿐만 아니라 확장되지 않습니다.

  4. ==============================

    4.개인적으로, 나는 ID 필드 또는 다른 숫자 필드에 LIKE 문자열 비교를 사용하지 않을 것입니다. 그것은 반환 "216"ID 번호 검색에 대한 이해가되지 않습니다 16216, 21651, 3216087, 5321668 ..., 등등 등등; 마찬가지로 급여.

    개인적으로, 나는 ID 필드 또는 다른 숫자 필드에 LIKE 문자열 비교를 사용하지 않을 것입니다. 그것은 반환 "216"ID 번호 검색에 대한 이해가되지 않습니다 16216, 21651, 3216087, 5321668 ..., 등등 등등; 마찬가지로 급여.

    당신은 SQL 주입을 방지하기 위해 준비된 문을 사용하려는 경우 또한, 당신은 같은 쿼리 문자열을 사용합니다 :

    SELECT * FROM job WHERE `position` LIKE CONCAT('%', ? ,'%') OR ...
    
  5. ==============================

    5.난 내가 일반적으로 선호하는 방법을 설명합니다 :

    난 내가 일반적으로 선호하는 방법을 설명합니다 :

    우선이 방법 당신은 계산 속도를 얻는 목적으로 메모리를 희생 할 것을 고려 할 필요가있다. 두 번째는 편집 할 수있는 권리를 테이블 구조가 필요합니다.

    1) 필드를 추가 (난 보통은 테이블의 모든 데이터를 저장하는 곳)가 "소화"호출합니다.

    필드는 같이 보일 것이다 :

    "N-N1-N2-N4-N3-N5-N7-N6-N8-N9"등 여기서, n은 하나의 단어

    나는 "와" "을 대체 타르 정규 표현식을 사용하여이 달성 -". 이 필드는 하나 sigle 문자열 "소화"모든 테이블 데이터의 결과이다.

    2) 소화 필드에서 LIKE 문 % 키워드 %를 사용합니다 :

    SELECT * FROM table WHERE digest LIKE %keyword%
    

    당신처럼 보이는 동시에 여러 키워드를 검색 할 수 있도록 조금이라도 루프 쿼리를 구축 할 수 있습니다 :

    SELECT * FROM table WHERE 
     digest LIKE %keyword1% AND 
     digest LIKE %keyword2% AND 
     digest LIKE %keyword3% ... 
    
  6. ==============================

    6.11.9.2에서보다 상세 도움으로 .. 경기에 대하여 : 현재 스레드의 다른 간단한 옵션을 찾을 수 있습니다. 부울 전체 텍스트 검색

    11.9.2에서보다 상세 도움으로 .. 경기에 대하여 : 현재 스레드의 다른 간단한 옵션을 찾을 수 있습니다. 부울 전체 텍스트 검색

    이것은 단지의 경우 다른 사람의 필요보다 컴팩트 한 옵션입니다. 이것은 쉽게 달성 할 수있는 테이블에 인덱스 FULLTEXT을 만들 필요합니다.

    인덱스를 생성하는 방법에 대한 정보 (MySQL의) : MySQL의 전체 텍스트 인덱싱 및 검색

    전체 텍스트 색인에서는 결과가 인덱스 이름 검색과 SQL 문이 될 것입니다, 하나 이상의 열이 나열 할 수 있습니다 :

    SELECT *,MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*') as relevance  FROM `documents`USE INDEX(search) WHERE MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*' IN BOOLEAN MODE) ORDER BY relevance;
    

    나는 행운과 함께, 여러 열로했습니다. 여러 열이 인덱스에서 허용하더라도, 당신은 여전히 ​​경기 / 반대 성명서와 함께 사용하기에 각 열에 대한 인덱스가 필요합니다.

    당신의 CRITERIAS에 따라 당신도 옵션을 사용할 수 있습니다.

  7. ==============================

    7.나는이 조금 늦게 알고하지만 나는 우리의 응용 프로그램에했던 것은 이것이다. 상점이 의지 도움말 사람을 바랍니다. 그러나 그것은 나를 위해 작동합니다 :

    나는이 조금 늦게 알고하지만 나는 우리의 응용 프로그램에했던 것은 이것이다. 상점이 의지 도움말 사람을 바랍니다. 그러나 그것은 나를 위해 작동합니다 :

    SELECT * FROM `landmarks` WHERE `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword'
    OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE 'keyword%' 
    OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword%'
    
  8. from https://stackoverflow.com/questions/759580/how-to-implement-a-keyword-search-in-mysql by cc-by-sa and MIT license