2011-01-29 52 views
5

我有一大套查詢,並使用levenshtein來計算拼寫錯誤,現在levenshtein導致mysql獲取完整的cpu時間。 我的查詢是在UNION語句中的全文搜索+ levenshtein。 sql1是我當前的查詢,sql2是隻有全文搜索,它是快速的,並沒有使用太多的CPU時間,最後一個leventhein哪一個會達到頂峯!levenshtein替代

你們中的任何一個人都有另一種獲得錯別字的方法嗎? 請不要回答規範化的數據,我想到了這一點,但不適用於我的數據,因爲我不能預先進行匹配/計算,並創建一個單獨的索引表。

  $sql1 = "(SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE)) UNION (SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3) ORDER BY sanction_id"; 

     $sql2 = "SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE) ORDER BY sanction_id"; 

     $sql3 = "SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3"; 

回答

4

如果你只與MySQL綁定,那麼不是一個簡單的解決方案。

通常這是使用專門的ngram索引進行快速候選查找過濾,然後計算levenstin只在類似的10-50候選人,這是更快計算levensthein所有對。喜歡的Solr/Lucene的

專業全文搜索引擎有這個內置的。

PostgreSQL有pg_trgm的contrib模塊(http://www.postgresql.org/docs/9.0/static/pgtrgm.html),它的工作原理是魅力。

你甚至可以在MySQL中使用全文索引來模擬這個,但是你必須從你的所有文檔中收集單詞,將它們轉換爲ngram,在它們上創建全文索引,並將它們一起快速查找。這給冗餘帶來了各種麻煩,同步...不值得你花時間。