[英]Best way to emulate fulltext search in a InnoDB/MySQL database using Codeigniter
[英]Best way to perform unstructured text search in MySQL using FULLTEXT Index
我有一張 MySQL 的大表,其中包含 20 毫米的銷售記錄和 10 列左右。 其中兩列是POSTCODE和STREET 。 我已經配置了表,以便我在這兩列上定義了一個 FULLTEXT 索引。 我的問題是,當我使用以下查詢搜索該表時,我得到了一堆隨機結果,我希望在這些結果中獲得更接近的匹配……例如:
SELECT * FROM table1 WHERE MATCH(postcode, street) AGAINST ('W4 RAVEN' IN NATURAL LANGUAGE MODE)
產生一堆結果(見下面的前 5 個)
郵政編碼 | 街道 |
---|---|
WS5 3PZ | 烏鴉路 |
WD18 7DA | 烏鴉關閉 |
DE55 5NR | 烏鴉大道 |
IP28 7LF | 烏鴉關閉 |
WD18 7DB | 烏鴉關閉 |
事實上,如果我運行這個查詢,我會得到下面的結果,這對我來說看起來比上面的結果更相關......?
SELECT postcode, street from table1 where postcode LIKE "W4 5EQ%" LIMIT 5
郵政編碼 | 街道 |
---|---|
W4 5情商 | 拉文斯科夫特路 |
W4 5情商 | 拉文斯科夫特路 |
W4 5情商 | 拉文斯科夫特路 |
W4 5情商 | 拉文斯科夫特路 |
W4 5情商 | 拉文斯科夫特路 |
我誤解了搜索的工作原理嗎?
我希望上面的兩個查詢都能返回非常相似的結果。 我想使用第一個的原因是因為有時用戶可能只搜索RAVEN有時只搜索W4 ,所以我不想將它們限制為列類型。
編輯澄清:鑒於我的表有類似於第二個查詢給出的記錄,我希望第一個查詢給出比它返回的更相似的東西(“更接近”匹配)
很抱歉,比較兩個查詢的結果就像比較蘋果和梨!
在第一個查詢中,您搜索郵政編碼的一部分和街道名稱的一部分。 不知道為什么您會驚訝於它返回搜索字符串出現在街道名稱列中的行。 更不用說 W4 可能被忽略的事實,因為它對於一個詞來說太短了。 innodb 表的默認最小字長為 3,如果將此限制減少到 2 並重建全文索引。 那么您的搜索結果也會更准確。
在第二個查詢中,您只搜索特定的郵政編碼,因此您的結果也會更加具體。
請記住,全文搜索不像谷歌搜索! 它不使用機器學習或類似的數據科學技術來猜測搜索表達式的不同部分之間的關系!
IN NATURAL MODE
不適合地址。 建議IN BOOLEAN MODE
,也許在每個術語前面加上加號 ( +
)。innodb_ft_min_token_size
值為 3。因此,“W4”將被忽略。 您可以更改它,但是,這將意味着重建所有 FT 索引。+W4*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.