programing

부울 모드의 MySQL FullText: 문자열의 일부로 '+'가 포함된 키워드 검색

shortcode 2022. 9. 25. 15:11
반응형

부울 모드의 MySQL FullText: 문자열의 일부로 '+'가 포함된 키워드 검색

나는 '비슷한' 질문들을 12개 봤지만 운이 없었다.이해는 합니다.+BOULLANT 모드의 FULLTEXT 키워드에 부가된 것은 특별한 의미가 있지만, 만약 우리의 키워드가 실제로+텍스트/문자열의 접미사 부분으로 기호를 지정합니다.FULL-TEXT 검색을 사용하여 적절한 결과를 얻을 수 있는 방법은 무엇입니까?

데이터베이스 구조

CREATE TABLE `ft_test` (
  `i_id` int(11) NOT NULL,
  `i_desc` mediumtext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `ft_test`
  ADD PRIMARY KEY (`i_id`) USING BTREE;
ALTER TABLE `ft_test` ADD FULLTEXT KEY `i_desc` (`i_desc`);

ALTER TABLE `ft_test`
  MODIFY `i_id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

데이터베이스 데이터

SELECT * FROM ft_test;
+------+-----------+
| i_id | i_desc    |
+------+-----------+
|    1 | test      |
|    2 | test+     |
|    3 | test++    |
|    4 | test +    |
|    5 | test plus |
+------+-----------+

테스트 #1: Like Query(쿼리처럼)

SELECT * FROM ft_test WHERE i_desc LIKE 'test+%';
+------+--------+
| i_id | i_desc |
+------+--------+
|    2 | test+  |
|    3 | test++ |
+------+--------+

테스트 2: 전문 쿼리

SELECT *, MATCH(`i_desc`) AGAINST ('"test+"' IN BOOLEAN MODE) AS RELEVANCE
    -> FROM `ft_test`
    -> WHERE MATCH(`i_desc`) AGAINST ('"test+"' IN BOOLEAN MODE)
    -> ORDER BY RELEVANCE;

+------+-----------+-----------+
| i_id | i_desc    | RELEVANCE |
+------+-----------+-----------+
|    1 | test      |         1 |
|    2 | test+     |         1 |
|    3 | test++    |         1 |
|    4 | test +    |         1 |
|    5 | test plus |         1 |
+------+-----------+-----------+

보시는 바와 같이 LIKE 쿼리는 실제로 결과를 반환하고 정렬하는 것이 더 좋습니다.정확한 일치에 대해서도 견적을 사용해 보았습니다만, 같은 결과입니다.'test\+'와 같은 'special' 문자를 추가하는 것도 도움이 되지 않았다.FT 결과는 쓸모없지는 않지만, 주문은 내가 예상했던 것과 다르기 때문에 완벽하지 않습니다.

질문.

실제로 FULLTEXT 모드를 사용하여 LIKE와 같은 결과를 반환할 수 있습니까?만약 그렇다면, 어떻게?

감사합니다!

문자를 구두점이 아닌 일반 문자로 처리하는 조회를 사용하여 열을 정의하는 경우에만 구두점 문자를 인덱싱할 수 있습니다.

이 조작 순서를 나타내는 메뉴얼 페이지가 있습니다.https://dev.mysql.com/doc/refman/8.0/en/full-text-adding-collation.html

그러나 스크립트가 하드 코딩되어 있다고 하셨기 때문에 검색 중인 컬럼의 조회를 재정의하거나 커스텀 조회 정의를 설치한 후 MySQL 서버를 재시작할 수 없습니다.

회피책은 구두점 없이 단어를 검색한 후 일치하는 단어를 찾은 후 적용할 조건을 추가하는 것입니다.

SELECT *, MATCH(`i_desc`) AGAINST ('"test"' IN BOOLEAN MODE) AS RELEVANCE
FROM `ft_test`
WHERE MATCH(`i_desc`) AGAINST ('"test"' IN BOOLEAN MODE)
 AND i_desc LIKE 'test+%';
ORDER BY RELEVANCE;

전체 텍스트 인덱스를 사용하여 단어와 일치하는 행을 찾은 다음 다른 조건 용어는 문자열이 있는 행의 집합(바람직하게 작은)에 대해 필터링합니다.+포함된.

그러나 SQL 쿼리를 변경할 수 있는 액세스 권한이 없는 경우 이는 무트입니다.

MySQL 전체 텍스트 검색에서 특수 문자를 인식하지 않습니다.단어만 검색하도록 되어 있습니다.+그렇지 않습니다.

특수 문자를 필터링하려면LIKE그게 네게 필요한 거야

또한 InnoDB를 통해+기호는 단어 앞에만 배치될 때 특별한 의미가 있습니다.따라서 현재 쿼리는 실제로 다음과 같습니다.

MATCH(`i_desc`) AGAINST ('"test"' IN BOOLEAN MODE)

언급URL : https://stackoverflow.com/questions/54818233/mysql-fulltext-in-boolean-mode-searching-keywords-that-contain-as-part-of-t

반응형