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"
쿼리는 작동하지만 확장도 되지 않습니다.
개인적으로, 저는 그것을 사용하지 않을 것입니다.LIKE
ID 필드 또는 다른 숫자 필드에서 문자열 비교.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
'programing' 카테고리의 다른 글
봄 주석 기반 DI 대 xml 구성? (0) | 2023.08.01 |
---|---|
Oracle SDO_GEOMETY에 대한 SRID를 변경하는 방법 (0) | 2023.08.01 |
ES6로 작성된 모듈을 NPM에 게시하려면 어떻게 해야 합니까? (0) | 2023.08.01 |
xampp에서 컬을 활성화하는 방법은 무엇입니까? (0) | 2023.08.01 |
CSS 상자 섀도 맨 아래만 (0) | 2023.08.01 |