MySQL的全文對待文本作爲短語和不作爲一個詞的詞e-magazine
。因爲它導致兩個單詞e
和magazine
。雖然它建立搜索索引,但它不會將e
添加到索引,因爲ft_min_word_len
(默認值爲4個字符)。
搜索查詢使用相同的長度限制。這就是爲什麼搜索e-magazine
返回的結果與a-magazine
完全相同的原因,因爲a
和-
被完全忽略。
但現在你想找到確切的短語e-magazine
。通過您使用引號,那就是找到短語完全正確的方法,但MySQL不支持運營商的短語,只爲一句話:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
有了這個修改,某些字符具有特殊意義開始的時候還是在搜索字符串話結束
有些人會建議使用以下查詢:
SELECT id, name
FROM company
WHERE MATCH(name) AGAINST('e-magazi*' IN BOOLEAN MODE)
HAVING name LIKE 'e-magazi%';
正如我所說的MySQL忽略e-
並搜索通配詞magazi*
。在獲得這些結果後,它使用HAVING
對的結果進行過濾,包括e-
。通過這你會發現短語e-magazine AG
。當然,只有當搜索短語包含通配符運算符時,才需要使用HAVING
,並且不應使用引號。這個操作符被你的用戶使用,而不是你!
注:只要你不圍繞搜索短語與%
它會發現只有以該字開始的字段。而且你不想圍繞它,因爲它也會找到bee-magazine
。所以也許你需要額外的OR HAVING name LIKE ' %e-magazi%' OR HAVING NAME LIKE '\\n%e-magazi%'
才能在文本中使用它。
招數
但最後我更喜歡這樣是不是需要在所有一招HAVING
:
- 如果添加文本到您的數據庫表,另外將它們添加到一個單獨的全文索引的列並用
up-to-date uptodate
替換up-to-date
等詞。
- 如果
up-to-date
用戶搜索與uptodate
取代它在查詢中。
通過,你仍然可以找到user-specific
specific
但up-to-date
以及(不僅date
)。
獎金
如果-well-known huge ports
MySQL的用戶搜索把它僞裝成not include *well*, could include *known* and *huge*
。當然你可以解決與其他額外的查詢變型爲好,但你上面的伎倆刪除連字符因此搜索查詢看起來簡直像:
SELECT id
FROM texts
WHERE MATCH(text) AGAINST('-wellknown huge ports' IN BOOLEAN MODE)
有趣的問題。我可以在這裏用一個像uuid字段的表格複製它。 'SELECT id,bootid FROM socket WHERE MATCH(bootid)AGAINST('+「18bda775」'BOOLEAN MODE);'會工作,如果我搜索「18bda775-711c」,但搜索「18bda」或「18bda775 -711「不起作用。有問題的'bootid'字段包含:18bda775-711c-4329-9de2-a3d81dc13d06 –
我們也試圖改變布爾控制字符,而不是使用# - 但它沒有任何效果(是的,我修好了變更後的表索引) :'ft_boolean_syntax = +#><()〜*:「」&|' – hajo