> 데이터 베이스 > MySQL 튜토리얼 > mysql 함수 전체 텍스트 검색 기능

mysql 함수 전체 텍스트 검색 기능

伊谢尔伦
풀어 주다: 2016-11-23 11:56:31
원래의
1636명이 탐색했습니다.

구문:

 MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
로그인 후 복사

MySQL은 전체 텍스트 인덱싱 및 검색 기능을 지원합니다. MySQL의 전체 텍스트 인덱스 유형 FULLTEXT 인덱스입니다. FULLTEXT 인덱스는 MyISAM 테이블에서만 사용할 수 있습니다. CREATE TABLE 문의 일부로 CHAR, VARCHAR 또는 TEXT 열에서 생성하거나 나중에 ALTER TABLE 또는 CREATE INDEX를 사용하여 추가할 수 있습니다. 더 큰 데이터 세트의 경우 FULLTEXT 인덱스가 없는 테이블에 데이터를 입력한 다음 인덱스를 생성하는 것이 기존 FULLTEXT 인덱스에 데이터를 입력하는 것보다 빠릅니다.

전체 텍스트 검색은 MATCH() 함수를 사용하여 수행됩니다.

mysql> CREATE TABLE articles (    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    ->   title VARCHAR(200),    ->   body TEXT,    ->   FULLTEXT (title,body)    -> );Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO articles (title,body) VALUES    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),    -> ('How To Use MySQL Well','After you went through a ...'),    -> ('Optimizing MySQL','In this tutorial we will show ...'),    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    -> ('MySQL vs. YourSQL','In the following database comparison ...'),    -> ('MySQL Security','When configured properly, MySQL ...');Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM articles    -> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
로그인 후 복사

MATCH() 함수는 데이터베이스 내에서 문자열에 대한 자연어 검색을 수행합니다. 데이터베이스는 FULLTEXT에 포함된 1개 또는 2개의 열 집합입니다. 검색 문자열은 AGAINST()에 인수로 제공됩니다. 테이블의 각 행에 대해 MATCH()는 상관 값, 즉 검색 문자열과 MATCH() 테이블의 지정된 열에 있는 해당 행의 텍스트 간의 유사성 측정값을 반환합니다.

기본적으로 검색은 대소문자를 구분하지 않고 수행됩니다. 그러나 인덱싱된 열에 대해 이진 정렬을 사용하면 대/소문자를 구분하는 전체 텍스트 검색을 수행할 수 있습니다. 예를 들어, latin1 문자 집합을 사용하는 열에 latin1_bin 정렬 방법을 제공하여 전체 텍스트 검색에서 대소문자를 구분하도록 할 수 있습니다.

위의 예와 같이 WHERE 문에서 MATCH()를 사용할 경우 해당 값은 음수가 아닌 부동 소수점 숫자입니다. 상관관계가 0이면 유사성이 없음을 의미합니다. 상관관계는 해당 줄의 단어 수, 해당 줄의 고유 단어 수, 데이터베이스의 총 단어 수, 고유 단어가 포함된 파일(줄) 수를 기반으로 계산됩니다.

자연어 전체 텍스트 검색의 경우 MATCH() 함수에 명명된 열이 테이블의 일부 FULLTEXT 인덱스에 포함된 열과 동일해야 합니다. 위 쿼리의 경우 MATCH() 함수에 명명된 열(제목 및 전체 텍스트)이 기사 테이블의 FULLTEXT 인덱스에 있는 열과 동일하다는 점에 유의하세요. 제목과 전문을 별도로 검색하려면 각 열에 FULLTEXT 인덱스를 생성해야 합니다.

또는 부울 검색을 실행하거나 쿼리 확장을 사용하여 검색하세요.

위의 예는 기본적으로 상관관계가 감소하는 순서로 행을 반환하는 MATCH() 함수를 사용하는 방법을 보여줍니다. 다음 예에서는 관련 값을 명시적으로 검색하는 방법을 보여줍니다. SELECT 문에 WHERE 또는 ORDER BY 절이 포함되어 있지 않기 때문에 반환된 행의 순서가 불확실합니다.

mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')    -> FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.65545833110809 |
|  2 |                                       0 |
|  3 |                        0.66266459226608 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
로그인 후 복사

다음 예는 더 복잡합니다. 쿼리는 관련 값을 반환하고 관련성이 낮은 순서대로 행을 정렬합니다. 이 결과를 얻으려면 MATCH()를 두 번 지정해야 합니다. 한 번은 SELECT 목록에, 한 번은 WHERE 절에 지정해야 합니다. 이는 MySQL 최적화 프로그램이 두 개의 MATCH() 호출이 동일하다는 것을 인식하고 전체 텍스트 검색 코드를 한 번만 활성화하기 때문에 추가 관리 작업이 발생하지 않습니다.

mysql> SELECT id, body, MATCH (title,body) AGAINST    -> ('Security implications of running MySQL as root') AS score    
-> FROM articles WHERE MATCH (title,body) AGAINST    -> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body           | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
로그인 후 복사

테이블에 2개의 행이 있습니다(0.00초)

MySQL FULLTEXT 실행은 단일 단어 문자 프로토타입(문자, 숫자 및 밑줄 부분)의 모든 시퀀스를 단어로 처리합니다. . 이 시퀀스에는 작은 따옴표(')가 포함될 수도 있지만 한 줄에 하나만 포함됩니다. 즉, aaa'bbb는 한 단어로 처리되고, aaa''bbb는 두 단어로 처리됩니다. FULLTEXT 구문 분석기에 의해 단어 앞이나 뒤에 있는 작은따옴표가 제거됩니다. 'aaa'bbb'는 aaa'bbb가 됩니다.

FULLTEXT 파서는 ''(쉼표), ,(쉼표), (마침표)와 같은 특정 구분 기호를 찾아 단어가 시작하고 끝나는 위치를 결정합니다. 단어가 구분 기호로 구분되지 않은 경우(예: 중국어) FULLTEXT 구문 분석기는 단어의 시작 위치와 끝 위치를 결정할 수 없습니다. 이러한 언어에서 FULLTEXT 인덱스에 단어나 기타 인덱스 용어를 추가하려면 "와 같은 임의의 구분 기호로 구분되도록 사전 처리해야 합니다.

일부 단어는 다음에서 무시됩니다. 전체 텍스트 검색:

너무 짧은 단어는 무시됩니다. 전체 텍스트 검색으로 찾은 단어의 기본 최소 길이는

에서 4자입니다. 불용어는 의미론적으로 간주하기에는 너무 일반적인 단어이지만 사용자 정의 목록을 통해 재정의될 수 있습니다. >

어휘 및 쿼리의 각 올바른 단어는 어휘 및 쿼리에서의 중요도에 따라 가중치가 부여됩니다. 이 방법을 사용하면 많은 문서에 나타나는 단어의 중요성이 낮아집니다(심지어 많은 단어도 중요도가 0임). 반대로 해당 단어가 드물면 해당 단어의 의미 가치가 낮기 때문입니다. 더 높은 중요도와 단어의 중요도가 결합됩니다. 이는 행의 관련성을 계산하는 데 사용됩니다.

이 기술은 큰 어휘집에 가장 잘 사용됩니다(실제로 매우 작은 테이블에 대해 신중하게 조정됩니다). . 의미론적 값을 완전히 반영하지 않으며 이 패턴은 때때로 이상한 결과를 생성할 수 있습니다. 예를 들어 기사 테이블의 모든 행에 "MySQL"이라는 단어가 표시되지만 이 단어를 검색하면 결과가 나오지 않을 수 있습니다.

mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('MySQL');
找不到搜索的词(0.00 秒)
로그인 후 복사

这个搜索的结果为空,原因是单词 “MySQL” 出现在至少全文的50%的行中。 因此, 它被列入停止字。对于大型数据集,使用这个操作最合适不过了----一个自然语言问询不会从一个1GB 的表每隔一行返回一次。对于小型数据集,它的用处可能比较小。

一个符合表中所有行的内容的一半的单词查找相关文档的可能性较小。事实上, 它更容易找到很多不相关的内容。我们都知道,当我们在因特网上试图使用搜索引擎寻找资料的时候,这种情况发生的频率颇高。可以推论,包含该单词的行因其所在特别数据集 而被赋予较低的语义价值。 一个给定的词有可能在一个数据集中拥有超过其50%的域值,而在另一个数据集却不然。

当你第一次尝试使用全文搜索以了解其工作过程时,这个50% 的域值提供重要的蕴涵操作:若你创建了一个表,并且只将文章的1、2行插入其中, 而文中的每个单词在所有行中出现的机率至少为 50% 。那么结果是你什么也不会搜索到。一定要插入至少3行,并且多多益善。需要绕过该50% 限制的用户可使用布尔搜索代码。

1. 布尔全文搜索

利用IN BOOLEAN MODE修改程序, MySQL 也可以执行布尔全文搜索:

mysql> SELECT * FROM articles WHERE MATCH (title,body)    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+
로그인 후 복사

这个问询检索所有包含单词“MySQL”的行,但不检索包含单词“YourSQL”的行。

布尔全文搜索具有以下特点:

它们不使用 50% 域值。.

它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置。

即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢。

最小单词长度全文参数和最大单词长度全文参数均适用。

停止字适用。

布尔全文搜索的性能支持以下操作符:

+

一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

-

一个前导的减号表示该单词一定不能出现在任何返回的行中。

(无操作符)

在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

> <

这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。请参见下面的例子。

( )

括号用来将单词分成子表达式。括入括号的部分可以被嵌套。

~

一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行。

*

星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上。

"

一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。

若索引中不存在该短语包含的单词,则结果为空。例如,若所有单词都是禁用词,或是长度都小于编入索引单词的最小长度,则结果为空。

以下例子展示了一些使用布尔全文符号的搜索字符串:

'apple banana'

寻找包含至少两个单词中的一个的行。

'+apple +juice'

寻找两个单词都包含的行。

'+apple macintosh'

寻找包含单词“apple”的行,若这些行也包含单词“macintosh”, 则列为更高等级。

'+apple -macintosh'

寻找包含单词“apple” 但不包含单词 “macintosh”的行。

'+apple +(>turnover

寻找包含单词“apple”和“turnover” 的行,或包含“apple” 和“strudel”的行 (无先后顺序),然而包含 “apple turnover”的行较包含“apple strudel”的行排列等级更为高。

'apple*'

寻找包含“apple”、“apples”、“applesauce”或“applet”的行。

'"some words"'

寻找包含原短语“some words”的行 (例如,包含“some words of wisdom” 的行,而非包含 “some noise words”的行)。注意包围词组的‘"’ 符号是界定短语的操作符字符。它们不是包围搜索字符串本身的引号。

2. 全文搜索带查询扩展

全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索 “database” 一词的用户,可能认为“MySQL”、“Oracle”、“DB2” and “RDBMS”均为符合 “databases”的项,因此都应被返回。这既为内隐知识。

在下列搜索短语后添加WITH QUERY EXPANSION,激活盲查询扩展功能(即通常所说的自动相关性反馈)。它将执行两次搜索,其中第二次搜索的搜索短语是同第一次搜索时找到的少数顶层文件连接的原始搜索短语。这样,假如这些文件中的一个 含有单词 “databases” 以及单词 “MySQL”, 则第二次搜索会寻找含有单词“MySQL” 的文件,即使这些文件不包含单词 “database”。下面的例子显示了这个不同之处:

mysql> SELECT * FROM articles    -> WHERE MATCH (title,body) AGAINST (&#39;database&#39;);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM articles    -> WHERE MATCH (title,body)    -> AGAINST (&#39;database&#39; WITH QUERY EXPANSION);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  3 | Optimizing MySQL  | In this tutorial we will show ...        |
+----+-------------------+------------------------------------------+
3 rows in set (0.00 sec)
로그인 후 복사

另一个例子是Georges Simenon 搜索关于Maigret的书籍, 这个用户不确定“Maigret”一词的拼法。若不使用查询扩展而搜索“Megre and the reluctant witnesses” 得到的结果只能是的“Maigret and the Reluctant Witnesses” 。 而带有查询扩展的搜索会在第二遍得到带有“Maigret”一词的所有书名。

注释:  盲查询扩展功能很容易返回非相关文件而增加无用信息,因此只有在查询一个长度很短的短语时才有必要使用这项功能。

3. 全文停止字

以下表列出了默认的全文停止字:

a's    able    about    above    according    

accordingly    across    actually    after    afterwards    

again    against    ain't    all    allow    

allows    almost    alone    along    already    

also    although    always    am    among    

amongst    an    and    another    any    

anybody    anyhow    anyone    anything    anyway    

anyways    anywhere    apart    appear    appreciate    

appropriate    are    aren't    around    as    

aside    ask    asking    associated    at    

available    away    awfully    be    became    

because    become    becomes    becoming    been    

before    beforehand    behind    being    believe    

below    beside    besides    best    better    

between    beyond    both    brief    but    

by    c'mon    c's    came    can    

can't    cannot    cant    cause    causes    

certain    certainly    changes    clearly    co    

com    come    comes    concerning    consequently    

consider    considering    contain    containing    contains    

corresponding    could    couldn't    course    currently    

확실히    설명됨    에도 불구하고    했다    하지 않았다    

다르게    한다    한다    하지 않는다    하지 않는다    

하지 않았다    완료    아래로    아래로       

각    edu    예    8    둘 중 하나    

다른 곳에서    충분히    완전히    특히    

et    etc    심지어    every    모든    

모두    모든 사람    모든 곳    ex    

정확히    예    제외    먼    몇 가지    

다섯 번째    처음    다섯 번째 팔로우    다음    

다음    for    이전    이전    앞으로    

4    from    더욱    더욱    얻기    

얻기    얻기    주어짐   주다    가다    

가다    가다    가다    얻다    얻다    

안녕하세요    그런 일이    없었습니다    거의 일어나지 않았습니다    

않았습니다    한 적이 없습니다    그는    

그는    안녕하세요    도와주세요       

그녀    여기    여기    이후    여기    

나는    내가    즉    만약    무시한다면    

즉시    in    inc    실제로    

표시    표시    표시    inner    insofar    

대신    into    inward    is    안    

그것    그랬을    그럴 거야    그건    그거    

그 자체로    그냥    유지    유지    

알고    알고    알고 있음    마지막으로    최근에    

나중에    늦게    늦게    적어도    적게    

하지 않도록    하자    하자    좋아요    좋아요    

아마    조금 봐    보고    본다    

ltd    주로    많은    아마도    어쩌면    

나    의미    그동안    단순히    그럴 수도    

더    더욱이    가장   대부분    많이    

반드시    내    나 자신    이름    즉    

nd    near    거의    필요함    필요함    

필요함    둘 다    절대    그럼에도 불구하고    새로    

다음    9    아니요    아무도    없음    

없음    아무도    또한    보통    아님    

아무것도    소설이 없습니다    지금은 아무데도    확실히    

의    꺼짐    자주    오    알았어    

알았어    오래된    온    한 번    한 번    

한 번    만    또는    다른    

다른 사람들    그렇지 않으면    해야    우리의    우리의    

우리 자신을    외부    외부    전체적으로    

자신의    특별히    특히    당    아마도    

위치에    부탁합니다    더하기    가능할 것입니다    

아마도    제공할    que    아주    qv    

오히려    번째    다시    정말로    합리적으로    

에 관해서는    상대적으로    각각    

맞습니다    말했습니다    동일하다고    봤다    말합니다    

말하기    말하기    두 번째    두 번째로    본다    

본다    보인다    것 같았다   것 같다    

본    자신    자신을    분별있는    보냈다    

심각하게    진지하게    일곱    여러    해야    

그녀가    해야     이후로는    6    

그래서    어떤 사람    누군가    어쨌든    누군가    

뭔가    때때로    때때로    다소    어딘가    

곧    죄송합니다    지정    지정    지정    

아직    sub    그런    sup    물론    

t's    take    take    tell    tends    

th    than 고마워요    고마워요    고마워요    

그게    그게    그들의    그들의    

그들의    그들    그들의    그들    그럼    

거기       그 이후에는    그러므로    그러므로    

거기에    거기    그럼    이것들    그들    

그들은    그들은    그들은    생각해    

세 번째    이    완전히    완전히    저것들    

그래도    세    을 통해    전체적으로    부터   

그래서    to    함께    역시    걸었습니다    

향해    향하여    시도    시도    정말로    

두 번    두 번 시도      un    

안타깝게도    가능성이 없을 때까지       

사용    우리    사용    

사용    up    유용함    사용    사용    보통    

값    다양함    매우    via    viz    

vs    want    want    was    않았음    

방식   우리는    우리는    우리는    우리는    

우리는    환영합니다    글쎄    갔습니다    갔었습니다    

무슨 일이던    무엇이든    언제  

어디에서    언제든지    어디에    어디에    

그런데    어디서    어디서    어디서든    어디서든    

어디서든   동안    어디로    누구    

누가    누구든지    전체    누구    누구의    

왜    원하는    원하는      

내에서    없으면    하지 않을 것이다    궁금하다    할 것이다    

하지 않을 것이다    하지 않을 것이다    예 아직    당신은    

당신은    당신은    당신은    당신은    당신의    

당신의    당신 자신    당신 자신    0    

4. 전체 문서 정의

전체 문서는 MyISAM 表입니다.

전체 문서는 多字节字符集一起使用。Unicode属于例extent情况;  可使用utf8 字符集 , 而非ucs2字符集。

중국어, 일본어 등의 표의 문자에는 맞춤 구분 기호가 없습니다. 따라서 FULLTEXT 파서는 이러한 언어나 다른 언어에서 단어가 시작하고 끝나는 위치를 확인할 수 없습니다.

단일 테이블에서 여러 문자 집합이 지원되는 경우 FULLTEXT 인덱스의 모든 열은 동일한 문자 집합과 라이브러리를 사용해야 합니다.

MATCH() 열 목록은 MATCH()가 IN BOOLEAN MODE에 있지 않는 한 테이블의 일부 FULLTEXT 인덱스 정의에 있는 열 목록과 정확히 일치해야 합니다.

AGAINST()에 대한 인수는 상수 문자열이어야 합니다.

5. MySQL 전체 텍스트 검색 세부 조정

MySQL의 전체 텍스트 검색 기능에는 사용자가 조정할 수 있는 매개변수가 거의 없습니다. MySQL 소스 배포판이 있는 경우 일부 변경에는 소스 코드 수정이 필요하므로 전체 텍스트 검색 성능을 더 효과적으로 제어할 수 있습니다.

보다 효과적인 검색을 위해서는 전체 텍스트 검색을 주의 깊게 조정해야 합니다. 실제로 기본 성능을 수정하면 대부분의 경우 성능이 저하됩니다. 수행 중인 작업을 알지 않는 한 MySQL 소스를 변경하지 마십시오.

아래 설명된 대부분의 전체 텍스트 변수는 서버 시작 시 설정되어야 합니다. 이를 변경하려면 서버를 다시 시작해야 하며, 서버가 실행되는 동안에는 변경되지 않습니다.

일부 변수를 변경하려면 테이블에서 FULLTEXT 인덱스를 다시 작성해야 합니다. 관련 작동 지침은 이 장의 끝부분에 나와 있습니다.

ft_min_word_len 및 ft_max_word_len 시스템 인수는 색인 단어의 최소 및 최대 길이를 지정합니다. 기본 최소값은 4자입니다. 기본 최대값은 사용되는 MySQL 버전에 따라 다릅니다. 값을 변경하는 경우 FULLTEXT 인덱스를 다시 작성해야 합니다. 예를 들어, 3자 단어를 검색 가능하게 하려면 다음 행을 선택 파일로 이동하여 ft_min_word_len 변수를 설정할 수 있습니다:

· [mysqld]

· ft_min_word_len= 3

그런 다음 서버를 다시 시작하고 FULLTEXT 인덱스를 다시 작성하세요. 또한 표 뒤에 있는 설명에서 myisamchk에 대한 설명에 특별한 주의를 기울이십시오.

기본 중지 단어를 재정의하려면 ft_stopword_file 시스템 변수를 설정할 수 있습니다. 변수 값은 중지 단어가 포함된 파일 경로 이름이거나 중지 단어 필터링을 중지하는 데 사용되는 빈 문자열이어야 합니다. 이 변수의 값이나 불용어 파일의 내용을 변경한 후 FULLTEXT 인덱스를 다시 작성하십시오.

불용 단어는 자유 형식입니다. 즉, 줄 바꿈, 공백, 쉼표 등 영숫자가 아닌 문자를 사용하여 불용 단어를 구분할 수 있습니다. 단어의 일부로 간주되는 밑줄 문자(_)와 작은따옴표(')는 예외입니다. 중지 단어 문자 집합은 서버의 기본 문자 집합입니다.

자연어 쿼리의 50% 임계값은 선택한 특정 균형에 따라 결정됩니다. 이를 방지하려면 myisam/ftdefs.h에서 다음 줄을 찾으세요.

· #define GWS_IN_USE GWS_PROB

줄을 다음으로 변경하세요.

#define GWS_IN_USE GWS_FREQ

그런 다음 MySQL을 다시 컴파일하세요. 지금은 인덱스를 다시 작성할 필요가 없습니다. 참고: 이렇게 하면 MATCH() 함수에 적절한 상관 값을 제공하는 MySQL의 기능이 심각하게 저하됩니다. 이러한 일반적인 단어를 검색해야 하는 경우에는 50% 임계값을 따르지 않으므로 대신 IN BOOLEAN MODE를 사용하는 것이 좋습니다.

부울 전체 텍스트 검색에 사용되는 연산자를 변경하려면 ft_boolean_syntax 시스템 변수를 설정하세요. 이 변수는 서버가 실행되는 동안에도 변경할 수 있지만 그렇게 하려면 SUPER 권한이 있어야 합니다. 이 경우 인덱스를 다시 작성할 필요가 없습니다.

인덱스에 영향을 미치는 전체 텍스트 변수(ft_min_word_len, ft_max_word_len 또는 ft_stopword_file)를 변경하거나 중지 단어 파일 자체를 변경하는 경우 변경하고 서버를 다시 시작한 후 FULLTEXT 인덱스를 다시 작성해야 합니다. . 이때 인덱스를 재구축하려면 QUICK 복구 작업을 수행하면 됩니다:

mysql> REPAIR TABLE tbl_name QUICK;

myisamchk를 사용하여 테이블 인덱스를 수정하는 작업을 수행하는 경우 (예: 복구 또는 구문 분석) FULLTEXT 인덱스는 달리 지정하지 않는 한 최소 및 최대 단어 길이와 중지 단어에 대한 기본 전체 텍스트 매개변수 값을 사용하여 다시 작성됩니다. 이로 인해 쿼리가 실패하게 됩니다.

이 문제는 서버만이 이러한 매개변수를 알고 있기 때문에 발생합니다. 해당 저장 위치는 MyISAM 인덱스 파일에 없습니다. 서버에서 최소 단어 길이나 최대 단어 길이 또는 중지 단어를 수정한 경우 이 문제를 방지하려면 mysqld에 사용하는 것과 동일한 ft_min_word_len, ft_max_word_len 및 ft_stopword_file 값을 myisamchk에 지정하십시오. 예를 들어, 최소 단어 길이를 3으로 설정한 경우 다음과 같이 myisamchk를 사용하여 테이블을 수정할 수 있습니다:

shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

myisamchk와 서버가 전체 텍스트 매개변수에 대해 동일한 값을 사용하도록 하려면 선택 파일의 [mysqld] 및 [myisamchk] 섹션에 각 항목을 배치하십시오:

[mysqld]

ft_min_word_len=3

[myisamchk]

ft_min_word_len=3

myisamchk를 사용하는 대신 REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE 또는 ALTER TABLE을 사용하세요. 이러한 문은 어떤 전체 텍스트 매개 변수 값이 더 적합한지 알고 있는 서버에 의해 실행됩니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿