簡體   English   中英

使用 FULLTEXT 索引在 MySQL 中執行非結構化文本搜索的最佳方法

[英]Best way to perform unstructured text search in MySQL using FULLTEXT Index

我有一張 MySQL 的大表,其中包含 20 毫米的銷售記錄和 10 列左右。 其中兩列是POSTCODESTREET 我已經配置了表,以便我在這兩列上定義了一個 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*
  • 對於只檢查前綴的查詢,`LIKE 'W4%'可能比 FT 快。
  • 混合 FT 搜索和非 FT 搜索可能會很慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM