programing

MySQL에서 키워드 검색을 구현하는 방법은 무엇입니까?

minimums 2023. 8. 1. 20:23
반응형

MySQL에서 키워드 검색을 구현하는 방법은 무엇입니까?

저는 SQL 프로그래밍에 익숙하지 않습니다.

나는 들판이 있는 테이블 직업을 가지고 있습니다.id,position,category,location,salary range,description,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%'

VARCHAR 필드의 단일 키워드에 대해 다음을 사용할 수 있습니다.

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')
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%';

다음 필드가 포함된 키워드 테이블을 사용하는 것이 좋습니다.

Keyword
Id
Count (possibly)

키워드에 인덱스가 있습니다.다른 테이블에 삽입/업데이트/삭제 트리거를 만들어 행이 변경될 때 모든 키워드가 추출되어 이 테이블에 삽입(또는 대체)됩니다.

키워드로 계산하지 않으려면 단어 표가 필요합니다(만약 그렇다면, 그리고, 하지만...).

이러한 방식으로 키워드를 찾고자 하는 쿼리에 대해 최고의 속도를 얻을 수 있으며 "Java 및 RCA1802 포함"과 같은 더 복잡한 쿼리를 비교적 쉽게 구현할 수 있습니다.

"LIKE"쿼리는 작동하지만 확장도 되지 않습니다.

개인적으로, 저는 그것을 사용하지 않을 것입니다.LIKEID 필드 또는 다른 숫자 필드에서 문자열 비교.ID # "216"을 검색하여 16216, 21651, 316087, 5321668 등을 반환하는 것은 의미가 없습니다. 마찬가지로 급여도 마찬가지입니다.

또한 준비된 문을 사용하여 SQL 주입을 방지하려면 다음과 같은 쿼리 문자열을 사용합니다.

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

제가 일반적으로 선호하는 방법을 설명하겠습니다.

우선 이 방법을 사용하려면 계산 속도를 얻기 위해 메모리를 희생해야 한다는 점을 고려해야 합니다.둘째, 테이블 구조를 편집할 수 있는 권한이 있어야 합니다.

테이블의 모든 데이터를 저장할 필드(일반적으로 "다이제스트"라고 함)를 추가합니다.

필드의 모양은 다음과 같습니다.

"n-n1-n2-n3-n4-n5-n6-n7-n8-n9" 등.여기서 n은 단일 단어입니다.

저는 " ""를 "-"로 대체하는 정규 표현을 사용하여 이를 달성합니다.이 필드는 모든 테이블 데이터가 단일 문자열에서 "소화"된 결과입니다.

요약 필드에서 %keyword%와 같은 LIKE 문을 사용합니다.

SELECT * FROM table WHERE digest LIKE %keyword%

다음과 같이 여러 키워드를 동시에 검색할 수 있도록 작은 루프로 qQuery를 만들 수도 있습니다.

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

스레드에서 더 간단한 옵션인 매치 어게인을 찾을 수 있습니다.11.9.2의 보다 자세한 도움말을 참조하십시오. 부울 전체 텍스트 검색

이것은 누군가가 더 콤팩트한 옵션이 필요할 경우를 대비한 것입니다.이렇게 하려면 표에 색인 전체 텍스트를 작성해야 하며, 이 작업은 쉽게 수행할 수 있습니다.

인덱스 작성 방법(MySQL): MySQL FULLTEXT 인덱싱검색

FULLTEXT할 수 은 " " " " 입니다. 그러면 인덱스 이름이 지정된 SQL 문이 생성됩니다.search:

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;

여러 개의 열로 시도했지만 실패했습니다.인덱스에 여러 개의 열이 허용되더라도 일치/반대 문장과 함께 사용할 각 열에 대한 인덱스가 필요합니다.

기준에 따라 두 옵션 중 하나를 사용할 수 있습니다.

이게 좀 늦은 건 알지만 제가 우리 어플에서 한 건 이거예요.이것이 누군가에게 도움이 되기를 바랍니다.하지만 저한테는 효과가 있습니다.

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%'

언급URL : https://stackoverflow.com/questions/759580/how-to-implement-a-keyword-search-in-mysql

반응형